После некоторых трудностей мне удалось создать службу 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
протокол.