Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在WcfCoreMtomEncoder库中将安全模式设置为传输?_C#_Wcf_Wcf Binding_Wcf Security_Wcfcoremtomencoder - Fatal编程技术网

C# 如何在WcfCoreMtomEncoder库中将安全模式设置为传输?

C# 如何在WcfCoreMtomEncoder库中将安全模式设置为传输?,c#,wcf,wcf-binding,wcf-security,wcfcoremtomencoder,C#,Wcf,Wcf Binding,Wcf Security,Wcfcoremtomencoder,我正在尝试将文档发送到.Net核心应用程序中的web服务。但我了解到.NETCore不支持“MTOM” WSMessageEncoding.Mtom 所以我找到了这个图书馆,并认为我可以让它工作!??也许不是 这是我在.NETCore之前拥有的 BasicHttpBinding binding = new BasicHttpBinding(BasicHttpSecurityMode.Transport); var binding = new BasicHttpBi

我正在尝试将文档发送到.Net核心应用程序中的web服务。但我了解到.NETCore不支持“MTOM”

WSMessageEncoding.Mtom

所以我找到了这个图书馆,并认为我可以让它工作!??也许不是

这是我在.NETCore之前拥有的

        BasicHttpBinding binding = new BasicHttpBinding(BasicHttpSecurityMode.Transport);
        var binding = new BasicHttpBinding(BasicHttpSecurityMode.Transport)
        { 
            MessageEncoding = WSMessageEncoding.Mtom,
            TransferMode = TransferMode.Streamed
        };
        EndpointAddress endpoint = new EndpointAddress(url);
        ChannelFactory<T> channelFactory = new ChannelFactory<T>(binding, endpoint);
        var webService = channelFactory.CreateChannel();
BasicHttpBinding=新的BasicHttpBinding(BasicHttpSecurityMode.Transport);
var binding=新的BasicHttpBinding(BasicHttpSecurityMode.Transport)
{ 
MessageEncoding=WSMessageEncoding.Mtom,
TransferMode=TransferMode.Streamed
};
EndpointAddress端点=新的端点地址(url);
ChannelFactory ChannelFactory=新的ChannelFactory(绑定,端点);
var webService=channelFactory.CreateChannel();
这是我放进图书馆后得到的东西

        var encoding = new MtomMessageEncoderBindingElement(new TextMessageEncodingBindingElement());
        var transport = new HttpTransportBindingElement();
        transport.TransferMode = TransferMode.Streamed;
        var binding = new CustomBinding(encoding, transport);
        EndpointAddress endpoint = new EndpointAddress(url);
        ChannelFactory<T> channelFactory = new ChannelFactory<T>(binding, endpoint);
        var webService = channelFactory.CreateChannel();
var encoding=new MtomMessageEncoderBindingElement(new TextMessageEncodingBindingElement());
var transport=新的HttpTransportBindingElement();
transport.TransferMode=TransferMode.Streamed;
var绑定=新的CustomBinding(编码、传输);
EndpointAddress端点=新的端点地址(url);
ChannelFactory ChannelFactory=新的ChannelFactory(绑定,端点);
var webService=channelFactory.CreateChannel();
但是我在创建频道时遇到了这个异常

提供的URI方案“https”无效;应为“http”

根据这一点,我需要将安全模式设置为transport

问题-如何设置此库中传输的安全模式?
我查看了一些“HttpTransportBindingElement”属性,但没有真正看到要设置的属性

你说得对,它在基于核心的项目中很有用。
关于错误细节,这是因为在调用服务时,客户端和服务器端之间的绑定和服务地址应该一致。客户端中的服务Url必须通过
Https
协议工作,因为绑定使用传输层安全模式。事实上,在托管此类服务(传输安全模式)时,我们应该提供一个
Https
绑定地址。在客户端,我们构造一个自定义绑定来使用服务。然后可以通过
Https
协议与服务器通信。
为了使用
Https
协议,我们可以使用
HttpsTransportBindingElement
。请参考以下代码段

var encoding = new MtomMessageEncoderBindingElement(new TextMessageEncodingBindingElement());
            var transport = new HttpsTransportBindingElement();
            transport.TransferMode = TransferMode.Streamed;
            var binding = new CustomBinding(encoding, transport);
            EndpointAddress endpoint = new EndpointAddress("https://vabqia969vm:21011");
            ChannelFactory<IService> channelFactory = new ChannelFactory<IService>(binding, endpoint);
            var webService = channelFactory.CreateChannel();
            Console.WriteLine(webService.Test());
结果。

相关文档。


如果有什么我能帮忙的,请随时告诉我。

你好,亚伯拉罕。我有几个问题。1.当您说“我们应该创建具有相同绑定的WCF服务”时,如果我的客户端是.Net Core,而服务器端(我们的客户)是.Net Framework,我可以这样做吗。我相信这是因为他们的文档使用.Net框架代码来调用他们的服务。2.在您的第二个代码段中,您使用了“MtomMessageEncodingBindingElement”,我相信这是针对.Net Framework的,对吗?如果我是.Net Core,我不应该使用我找到的第三方库中的“MtomMessageEncoderBindingElement”吗?3.与问题2相同,但对于“ServiceHost”?首先,服务器端必须基于Dotnet framework,因为WCF framework尚未在Dotnet core中实现。我们无法在Dotnet核心项目中创建WCF服务。基于核心的客户端只是一个兼容的解决方案。许多功能尚未实现。1.以上客户端代码基于Dotnet Core,服务器端WCF以Dotnet framework为目标。如果我们在基于Dotnetframework的项目中调用该服务,则本机支持该服务。Dotnet框架已经支持MTOM编码。2.是的,因为支持MTOM编码是dotnet framework中的内置功能。这些代码片段是WCF服务器,不可能在Dotnet Core中实现。“相同绑定”是指自定义绑定而不是基本绑定。3.WCF服务尚未在AspDotCore中实现,“ServiceHost”也未实现。@user1186050,在上面的代码片段中,我们还可以创建一个没有传输层安全模式的服务。它也可以在Dotnet核心应用程序中正确调用。如果我们这样做,我们不需要指定'https'基址,也不需要绑定证书,它将很容易完成。
class Program
    {
        static void Main(string[] args)
        {
            Uri uri = new Uri("https://localhost:21011");
            MtomMessageEncodingBindingElement encoding = new MtomMessageEncodingBindingElement();
            var transport = new HttpsTransportBindingElement();
            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()
                    {
                        HttpsGetEnabled = true
                    };
                    sh.Description.Behaviors.Add(smb);
                }
                Binding mexbinding = MetadataExchangeBindings.CreateMexHttpsBinding();
                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();
        }
    }