Мыльный клиент .NET - PullRequest
       4

Мыльный клиент .NET

3 голосов
/ 04 августа 2009

у нас есть приложение для Windows. который ожидал соединить различные мыльные веб-сервисы. URL-адреса служб динамически добавляются в базу данных. Я пытался добавить «Добавить веб-ссылку», но проблема в том, что он принимает только один URL.

Может ли кто-нибудь предложить другой подход? Или ссылку на источник

Ответы [ 6 ]

3 голосов
/ 04 августа 2009

Просто установите свойство Url прокси. См. Способы настройки клиентского прокси ASMX .

2 голосов
/ 06 августа 2009

Я нашел такой фрагмент кода в " Динамический вызов веб-службы " в Блог Кирка Эванса Надеюсь, кто-то поможет ...


(исходному коду нужно было поработать. Это должно быть эквивалентно)

using System;
using System.CodeDom;
using System.CodeDom.Compiler;
using System.Diagnostics;
using System.Net;
using System.Security.Permissions;
using System.Web.Services.Description;
using System.Xml.Serialization;

namespace ConnectionLib
{
    internal class WsProxy
    {
        [SecurityPermission(SecurityAction.Demand, Unrestricted = true)]
        internal static object CallWebService(
            string webServiceAsmxUrl,
            string serviceName,
            string methodName,
            object[] args)
        {
            var description = ReadServiceDescription(webServiceAsmxUrl);

            var compileUnit = CreateProxyCodeDom(description);
            if (compileUnit == null)
            {
                return null;
            }

            var results = CompileProxyCode(compileUnit);

            // Finally, Invoke the web service method
            var wsvcClass = results.CompiledAssembly.CreateInstance(serviceName);
            var mi = wsvcClass.GetType().GetMethod(methodName);
            return mi.Invoke(wsvcClass, args);
        }

        private static ServiceDescription ReadServiceDescription(string webServiceAsmxUrl)
        {
            using (var client = new WebClient())
            {
                using (var stream = client.OpenRead(webServiceAsmxUrl + "?wsdl"))
                {
                    return ServiceDescription.Read(stream);
                }
            }
        }

        private static CodeCompileUnit CreateProxyCodeDom(ServiceDescription description)
        {
            var importer = new ServiceDescriptionImporter
                           {
                               ProtocolName = "Soap12",
                               Style = ServiceDescriptionImportStyle.Client,
                               CodeGenerationOptions =
                                   CodeGenerationOptions.GenerateProperties
                           };
            importer.AddServiceDescription(description, null, null);

            // Initialize a Code-DOM tree into which we will import the service.
            var nmspace = new CodeNamespace();
            var compileUnit = new CodeCompileUnit();
            compileUnit.Namespaces.Add(nmspace);

            // Import the service into the Code-DOM tree. This creates proxy code
            // that uses the service.
            var warning = importer.Import(nmspace, compileUnit);
            return warning != 0 ? null : compileUnit;
        }

        private static CompilerResults CompileProxyCode(CodeCompileUnit compileUnit)
        {
            CompilerResults results;
            using (var provider = CodeDomProvider.CreateProvider("CSharp"))
            {
                var assemblyReferences = new[]
                                         {
                                             "System.dll",
                                             "System.Web.Services.dll",
                                             "System.Web.dll", "System.Xml.dll",
                                             "System.Data.dll"
                                         };
                var parms = new CompilerParameters(assemblyReferences);
                results = provider.CompileAssemblyFromDom(parms, compileUnit);
            }

            // Check For Errors
            if (results.Errors.Count == 0)
            {
                return results;
            }

            foreach (CompilerError oops in results.Errors)
            {
                Debug.WriteLine("========Compiler error============");
                Debug.WriteLine(oops.ErrorText);
            }

            throw new Exception(
                "Compile Error Occurred calling webservice. Check Debug output window.");
        }
    }
}
2 голосов
/ 04 августа 2009

Я бы предложил вместо этого добавить ссылку на службу.

Однако вы все равно сможете установить только один адрес во время разработки.

Поэтому вам нужно читать URL-адреса из базы данных и устанавливать адрес прокси-сервера всякий раз, когда вы его используете.

1 голос
/ 16 декабря 2009

Как бы вы передали имя пользователя и пароль веб-службе, используя этот код. Веб-сервис, который я имею в виду, имеет следующий класс аутентификации:

Public Class AuthHeader : Inherits SoapHeader
    Public SalonID As String
    Public SalonPassword As String
End Class

Тогда в своем классе веб-сервисов оно имеет следующее:

    Public Credentials As AuthHeader 'Part of the general declarations of the class - not within any particular method



    Private Function AuthenticateUser(ByVal ID As String, ByVal PassWord As String, ByVal theHeader As AuthHeader) As Boolean
        If (Not (ID Is Nothing) And Not (PassWord Is Nothing)) Then
            If ((ID = "1")) And (PassWord = "PWD")) Then
                Return True
            Else
                Return False
            End If
        Else
            Return False
        End If
    End Function



    <WebMethod(Description:="Authenticat User."), SoapHeader("Credentials")> _
    Public Function AreYouAlive() As Boolean
        Dim SalonID As String = Credentials.SalonID
        Dim SalonPassword As String = Credentials.SalonPassword
        If (AuthenticateUser(ID, Password, Credentials)) Then
            Return True
        Else
            Return False
        End If
    End Function

Я обнаружил, что не могу получить прокси-класс, который вы упомянули выше, чтобы передать имя пользователя и пароль этому

1 голос
/ 04 августа 2009

Вы должны добавить веб-ссылку на каждую службу, к которой хотите подключиться. Ссылка генерирует прокси-классы, используемые для подключения к этой службе. Таким образом, для каждого отдельного сервиса, который вы хотите использовать, нужны свои ссылки.

0 голосов
/ 06 августа 2009

Источник находки qasanov : http://blogs.msdn.com/kaevans/archive/2006/04/27/585013.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...