Как разрешить привязку службы WCF WS2007HttpBinding в клиентском приложении .NET Core - PullRequest
0 голосов
/ 10 января 2019

Я располагаю службой WCF, реализованной с помощью WCF 4.6.1 Framework, содержащей конечную точку, связанную с WS2007HttpBinding. Моя цель - реализовать клиентское приложение .NET Core, которое вызывает эту службу. Когда я пытался использовать CustomBinding, он генерирует эту ошибку:

System.InvalidOperationException: в пользовательской привязке на ServiceEndpoint с контрактом 'IWSTrust13Sync' отсутствует TransportBindingElement. У каждой привязки должен быть хотя бы один элемент привязки, производный от TransportBindingElement. '

public class Program
{
    public static void Main(string[] args)
    {
        Message requestmessage = Message.CreateMessage(
          MessageVersion.Soap12WSAddressing10,
          "http://test/test",
           "This is the body data");

        var binding = new CustomBinding();
        var endpoint = new EndpointAddress(new Uri("http://servicetest.service.svc"));
        var channelFactory = new ChannelFactory<ServiceSTS.IWSTrust13Sync>(binding, endpoint);
        var serviceClient = channelFactory.CreateChannel();
        var result = serviceClient.Trust13ValidateAsync(requestmessage);
        channelFactory.Close();

        Console.WriteLine(result.Status);
    }
}

Есть ли замена WS2007HttpBinding в .NET Core?

Обратите внимание, что я не должен ничего менять в сервисе, потому что он используется другими приложениями

1 Ответ

0 голосов
/ 11 января 2019

Как показывает ошибка, вам не хватает TransportBindingElement. Привязка состоит из BingingElement, пользовательская привязка без bingingelement не имеет смысла. Если вы хотите использовать пользовательскую привязку, вы должны добавить в нее элемент binging.

BindingElement[] elements = new BindingElement[]
        {

                       new TextMessageEncodingBindingElement(),
          new HttpTransportBindingElement()
        };
        CustomBinding binding = new CustomBinding(elements);
                    using (ChannelFactory<ICalculatorService> channelFacoty = new ChannelFactory<ICalculatorService>(binding, new EndpointAddress("http://localhost:4000/calculator")))
        {
            ICalculatorService cal = channelFacoty.CreateChannel();
           Console.WriteLine( cal.Add(1, 3));
            Console.Read();
        }

Но так как вы используете ws2007httpbing на стороне сервера, почему бы не использовать ws2007httpbinding напрямую на вашей стороне клиента. Используя ws2007httpbinging, вам не нужно добавлять в него элементы binging (они были добавлены).

Ниже приведено простое использование привязки ws2007http.

  WS2007HttpBinding binding2 = new WS2007HttpBinding();
        using (ChannelFactory<ICalculatorService> channelFacoty = new ChannelFactory<ICalculatorService>(binding2, new EndpointAddress("http://localhost:4000/calculator")))
        {
            ICalculatorService cal = channelFacoty.CreateChannel();
           Console.WriteLine( cal.Add(1, 3));
            Console.Read();
        }

Но если ваша сервисная сторона имеет специальную конфигурацию подключения ws2007, вам лучше настроить настройку ws2007httpbing клиентской стороны в соответствии с его конфигурацией сервисной стороны.

Если ваша сторона службы опубликовала свои метаданные, вы можете добавить ссылку на нее и напрямую использовать клиент для вызова службы. https://www.dotnetforall.com/adding-wcf-service-reference-client/ Для svc адрес метаданных службы по умолчанию - это адрес + WSDL,

например, ваш адрес метаданных: http://servicetest.service.svc? Wsdl

Вы также можете использовать App.config для настройки вашего клиента.

<client>
   <endpoint address="http://localhost:4000/calculator" binding="ws2007HttpBinding"
  contract="ServiceInterface.ICalculatorService" name="cal" />
</client>

И затем вы можете напрямую создать клиента следующим образом:

 using (ChannelFactory<ICalculatorService> channelFacoty = new ChannelFactory<ICalculatorService>("cal"))
        {
            ICalculatorService cal = channelFacoty.CreateChannel();
           Console.WriteLine( cal.Add(1, 3));
            Console.Read();
        }

Пожалуйста, настройте ваш клиент в соответствии с конфигурацией конечной точки на стороне вашего сервера. Мой

<service name="Service.CalculatorService"  >
             <endpoint address="http://localhost:4000/calculator"  binding="ws2007HttpBinding"   contract="ServiceInterface.ICalculatorService"></endpoint>
  </service>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...