Обходные пути wsHttpBinding в .NET Core - PullRequest
0 голосов
/ 11 февраля 2019

Я ищу обходной путь ядра WCF wsHttpBinding.

Мне известно, что реализация WCF ядра .net в настоящее время не поддерживает wsHttpBinding (см. Матрицу поддержки здесь https://github.com/dotnet/wcf/blob/master/release-notes/SupportedFeatures-v2.1.0.md)

Я интегрируюсь с устаревшей сторонней службой, которая, по-видимому,только поддержка wsHttpBinding. Наш технический стек - ядро ​​.net, поэтому я не могу вернуться к полной версии .net framework или моно.

Вопрос в том, возможно ли использовать службу через пользовательские привязки?надеясь, что есть обходной путь, который, возможно, не полностью функционален, но, по крайней мере, позволяет мне использовать службу.

var cBinding = new CustomBinding();
        var textBindingElement = new TextMessageEncodingBindingElement()
        {
            MessageVersion = MessageVersion.Soap12WSAddressing10
        };
        cBinding.Elements.Add(textBindingElement);
        var httpBindingElement =
            new HttpsTransportBindingElement
            {
                AllowCookies = true, MaxBufferSize = int.MaxValue, MaxReceivedMessageSize = int.MaxValue, 
            };
        cBinding.Elements.Add(httpBindingElement);


        var myEndpoint = new EndpointAddress("https://..../Service.svc/wss");
        using (var myChannelFactory = new ChannelFactory<ISearch>(cBinding, myEndpoint))
        {
            myChannelFactory.Credentials.UserName.UserName = "...";
            myChannelFactory.Credentials.UserName.Password = "...";

            ISearch client = null;

            try
            {
                client = myChannelFactory.CreateChannel();

                var result = client.Find(new Search("Criteria")).Result;

                ((ICommunicationObject)client).Close();
                myChannelFactory.Close();
            }
            catch (Exception ex)
            {
                (client as ICommunicationObject)?.Abort();
            }
        }

Клиент создается и выполняется вызов службы, но он не выполняется, потому что:

Message = "Сообщение не может быть обработано. Это, скорее всего, потому, что действие '' неверно, или потому что сообщение содержит недопустимый или просроченный токен контекста безопасности или из-за несоответствия между привязкой

1 Ответ

0 голосов
/ 13 февраля 2019

Забудьте, они не полностью совместимы с Core.В некоторых указанных случаях может быть базовый вызов WsHttpBinding.Вы можете обратиться к следующему примеру.
Сервер.

   Uri uri = new Uri("http://localhost:11011");
    WSHttpBinding binding = new WSHttpBinding();
    binding.Security.Mode = SecurityMode.None;
    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()
            {
            };
            sh.Description.Behaviors.Add(smb);
        }
        Binding mexbinding = MetadataExchangeBindings.CreateMexHttpBinding();
        sh.AddServiceEndpoint(typeof(IMetadataExchange), mexbinding, "mex");
        sh.Opened += delegate
        {
            Console.WriteLine("Service is ready");
        };
        sh.Closed += delegate
        {
            Console.WriteLine("Service is clsoed");
        };                
        sh.Open();

Клиент (сгенерированный автоматически)

private static System.ServiceModel.Channels.Binding GetBindingForEndpoint(EndpointConfiguration endpointConfiguration)
    {
        if ((endpointConfiguration == EndpointConfiguration.WSHttpBinding_IService))
        {
            System.ServiceModel.Channels.CustomBinding result = new System.ServiceModel.Channels.CustomBinding();
            System.ServiceModel.Channels.TextMessageEncodingBindingElement textBindingElement = new System.ServiceModel.Channels.TextMessageEncodingBindingElement();
            result.Elements.Add(textBindingElement);
            System.ServiceModel.Channels.HttpTransportBindingElement httpBindingElement = new System.ServiceModel.Channels.HttpTransportBindingElement();
            httpBindingElement.AllowCookies = true;
            httpBindingElement.MaxBufferSize = int.MaxValue;
            httpBindingElement.MaxReceivedMessageSize = int.MaxValue;
            result.Elements.Add(httpBindingElement);
            return result;
        }  

Invocation.

ServiceReference1.ServiceClient client2 = new ServiceReference1.ServiceClient();
try
{
    var res = client2.SayHelloAsync();
    Console.WriteLine(res.Result);

}
catch (Exception)
{
    throw;
}

Хотя в большинстве случаев невозможно вызвать службу WCF, созданную WsHttpBinding.Чиновники также не намерены продолжать поддерживать план для wshttpbinding.Здесь связанные обсуждения.https://github.com/dotnet/wcf/issues/31
https://github.com/dotnet/wcf/issues/1370

...