Импортировать файл wsdl в проект C # WCF и выставлять контракты wsdl - PullRequest
0 голосов
/ 12 ноября 2018

У меня есть файл wsdl, предоставленный сторонней организацией, и мне нужно использовать его как есть и выставлять контракты в этом wsdl для использования.

Моя проблема в том, что у моего проекта есть собственное пространство имени этот wsdl поставляется с другим пространством имен, и я понятия не имею, как выполнить работу.

Благодарю за любую помощь

РЕДАКТИРОВАТЬ

Сторонние (gov) ожидают вызова службы со своим пространством имен

Пример: у меня есть Приложение службы WCF с пространством имен: local.namespace

WSDL:

<wsdl:definitions xmlns:ns0="http://com.gov.update.ws" targetNamespace="http://com.gov.update.ws">
    <wsdl:message name="updateStatus">
        <wsdl:part name="parameters" element="xsns:updateStatus" xmlns:xsns="http://com.gov.update.ws"/>
    </wsdl:message>
</wsdl:definitions>

Полученное SOAP:

<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Header>
      <ctx:clientContext xmlns:ctx="http://ClientContext">
         <ctx:clientUserId>123456</ctx:clientUserId>
      </ctx:clientContext>
   </soapenv:Header>
   <soapenv:Body>
      <p820:updateStatus xmlns:p820="http://com.gov.update.ws">
         <transactionId>123456</transactionId>
         <status>Accepted</status>
      </p820:updateStatus>
   </soapenv:Body>
</soapenv:Envelope>

1 Ответ

0 голосов
/ 13 ноября 2018

Как правило, мы используем прокси-класс клиента для вызова веб-службы, добавляя ссылку на службу. Следующим образом.
https://docs.microsoft.com/en-us/dotnet/framework/wcf/accessing-services-using-a-wcf-client
Вы также можете создать клиентский прокси-класс с помощью инструмента SVCUtil.
https://docs.microsoft.com/en-us/previous-versions/dotnet/netframework-3.5/aa347733(v=vs.90)
Я сделал простую демонстрацию, желаю, чтобы это было полезно для вас.
Сервер:

namespace Server8
{
    class Program
    {
        static void Main(string[] args)
        {
            Uri uri = new Uri("http://localhost:1900");
            BasicHttpBinding binding = new BasicHttpBinding();
            using (ServiceHost sh=new ServiceHost(typeof(MyService),uri))
            {
                sh.AddServiceEndpoint(typeof(IService), binding, "");
                ServiceMetadataBehavior smb;
                smb = sh.Description.Behaviors.Find<ServiceMetadataBehavior>();
                if (smb==null)
                {
                    smb = new ServiceMetadataBehavior()
                    {
                        HttpGetEnabled = true
                    };
                    sh.Description.Behaviors.Add(smb);
                }
                Binding binding1 = MetadataExchangeBindings.CreateMexHttpBinding();
                sh.AddServiceEndpoint(typeof(IMetadataExchange), binding1, "mex");
                sh.Open();
                Console.WriteLine("Service is ready...");

                Console.ReadLine();
                sh.Close();
            }

        }
    }
    [ServiceContract(Namespace ="mydomain")]
    public interface IService
    {
        [OperationContract(Name ="AddInt")]
        int Add(int x, int y);

    }
    public class MyService : IService
    {
        public int Add(int x, int y)
        {
            return x + y;
        }
    }
}

Итак, адрес WSDL:

Http://localhost:1900?wsdl

Svctutil Tool.

Svcutil http://localhost:1900?wsdl /directory:D: /namespace:”mydomain”,”LocalProjectNamespace”

Эта команда будет генерировать прокси-класс клиента в локальном разделе D и заменять пространство имен веб-службы на «LocalProjectNamespace», а также генерировать файл конфигурации клиента (xml), в котором описывается привязка службы и информация о конечной точке. enter image description here
И затем мы вызываем веб-сервис через клиентский прокси-класс.

static void Main(string[] args)
{
    ServiceClient client = new ServiceClient();
    try
    {
        var result = client.AddInt(23, 55);
        Console.WriteLine(result);
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.ToString());
    }
}

Не стесняйтесь, дайте мне знать, если есть что-то, с чем я могу помочь.

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