Как использовать WcfCoreMtomEncoder в. Net Core проекте? - PullRequest
2 голосов
/ 07 января 2020

Я хочу использовать этот WcfCoreMtomEncoder lib здесь в моем. Net Базовом проекте, но я не уверен, как использовать его синтаксически.

У меня есть этот код ниже, но я не могу использовать MessageEncoding, потому что я нахожусь в. Net Базовом проекте (без поддержки mtom):

var binding = new BasicHttpBinding(BasicHttpSecurityMode.Transport)
{ 
    // MessageEncoding = WSMessageEncoding.Mtom, not supported in .Net Core
    TransferMode = TransferMode.Streamed
};

EndpointAddress endpoint = new EndpointAddress(url);
var channelFactory = new ChannelFactory<T>(binding, endpoint);
var webService = channelFactory.CreateChannel();
user.UserName = await webService.EncryptValueAsync(userName);
user.Password = await webService.EncryptValueAsync(password);
var documentAddResult = webService.DocumentAdd(document);
channelFactory.Close();

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

var encoding = new MtomMessageEncoderBindingElement(new TextMessageEncodingBindingElement());
var transport = new HttpTransportBindingElement();
var customBinding = new CustomBinding(encoding, transport);

var client = new MtomEnabledServiceClient(customBinding);

, но я не уверен, что здесь? Как он будет использоваться для загрузки документа, которого я пытаюсь достичь? И библиотека делает это, или я неправильно понимаю, что она делает?

Если кто-нибудь может предоставить мне пример того, как использовать эту библиотеку для выполнения загрузки документа, это будет оценено.

Ответы [ 2 ]

1 голос
/ 24 января 2020

После некоторых трудностей мне удалось создать службу WCF, которая могла бы использоваться библиотекой классов. Но он поддерживает только Custombinding. Пожалуйста, обратитесь к приведенному ниже примеру.
На стороне сервера (консольное приложение на основе Do tnet Framework 4.7.2)

class Program
    {
        static void Main(string[] args)
        {
            Uri uri = new Uri("http://localhost:21011");
            MtomMessageEncodingBindingElement encoding = new MtomMessageEncodingBindingElement();
            var transport = new HttpTransportBindingElement();
            transport.TransferMode = TransferMode.Streamed;
            var binding = new CustomBinding(encoding, transport);
            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 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();
                Console.ReadLine();
                //pause
                sh.Close();
                Console.ReadLine();
            }
        }
    }
    [ServiceContract]
    public interface IService
    {
        [OperationContract]
        string Test();

    }
    public class MyService : IService
    {
        public string Test()
        {
            return DateTime.Now.ToLongTimeString();
        }
}

На стороне клиента (Консольное приложение на базе ядра с WcfCoreMtomEncoder пакет nuget, вызывающий службу с помощью ChannelFactory).

    class Program
    {
        static void Main(string[] args)
        {
            var encoding = new MtomMessageEncoderBindingElement(new TextMessageEncodingBindingElement());
            var transport = new HttpTransportBindingElement();
            transport.TransferMode = TransferMode.Streamed;
            var binding = new CustomBinding(encoding, transport);
            EndpointAddress endpoint = new EndpointAddress("http://vabqia969vm:21011");
            ChannelFactory<IService> channelFactory = new ChannelFactory<IService>(binding, endpoint);
            var webService = channelFactory.CreateChannel();
            Console.WriteLine(webService.Test());
        }
    }
    [ServiceContract]
    public interface IService
    {
        [OperationContract]
        string Test();

}

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

Netsh http add sslcert ipport = 0.0.0.0 certhash = 0102030405060708090A0B0C0D0E0F1011121314 appid = {00112233-4455-6677-8899 * AABBCCDEFF *

В приведенном выше примере я привязываю сертификат с именем vabqia969vm (DNS) к компьютеру (имя хоста vabqia969vm). Вот некоторые официальные ссылки.
https://docs.microsoft.com/en-us/windows/win32/http/add-sslcert
https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/how-to-configure-a-port-with-an-ssl-certificate
На стороне клиента, прежде чем звонить в службу, мы должны установить sh доверительные отношения, позволяющие установить связь между клиентской и серверной сторонами. Поэтому я устанавливаю сертификат сервера на клиентской стороне LocalCA (доверенные Root центры сертификации в хранилище сертификации). В качестве альтернативы, мы могли бы вручную добавить процесс проверки сертификата.

ChannelFactory<IService> channelFactory = new ChannelFactory<IService>(binding, endpoint);
            channelFactory.Credentials.ServiceCertificate.SslCertificateAuthentication = new System.ServiceModel.Security.X509ServiceCertificateAuthentication()
            {
                CertificateValidationMode = System.ServiceModel.Security.X509CertificateValidationMode.None,
                RevocationMode = System.Security.Cryptography.X509Certificates.X509RevocationMode.NoCheck
            };

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

0 голосов
/ 14 января 2020

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

var encoding = new MtomMessageEncoderBindingElement(new TextMessageEncodingBindingElement());
var transport = new HttpTransportBindingElement();
var customBinding = new CustomBinding(encoding, transport);


EndpointAddress endpoint = new EndpointAddress(url);
var channelFactory = new ChannelFactory<T>(customBinding, endpoint);
var webService = channelFactory.CreateChannel();
user.UserName = await webService.EncryptValueAsync(userName);
user.Password = await webService.EncryptValueAsync(password);
var documentAddResult = webService.DocumentAdd(document);
channelFactory.Close();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...