如何以编程方式为BasicHttpBinding指定HTTPS?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何以编程方式为BasicHttpBinding指定HTTPS?相关的知识,希望对你有一定的参考价值。

我正在尝试使用需要HTTPS的.NET 4(Visual Studio 2010)中的Web服务,并使用客户端证书进行身份验证。目前,我正在编写一个控制台程序,只是为了证明这个概念,但我遇到了让程序认识到它应该使用https的问题。至少这是错误所暗示的:

将HTTP请求发送到https://时发生错误。这可能是由于在HTTPS情况下未使用HTTP.SYS正确配置服务器证书。这也可能是由于客户端和服务器之间的安全绑定不匹配造成的。

这是我正在使用的示例代码:

class Program
{
    static void Main(string[] args)
    {
        try
        {
            BasicHttpBinding binding = new BasicHttpBinding();
            binding.Security.Mode = BasicHttpSecurityMode.Transport;
            binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate;

            Uri baseAddress = new Uri("https://<host>:<port>/<endpoint>");

            var certificate = new X509Certificate2("<localpath to certificate>.p12", "<password>");
            EndpointAddress endpointAddress = new EndpointAddress(baseAddress);

            ChannelFactory<LinePortType> factory = new ChannelFactory<LinePortType>(binding, endpointAddress);
            factory.Credentials.ClientCertificate.Certificate = certificate;
            LinePortType proxy = factory.CreateChannel();


            var header = new ctSoapHeaderMsg();
            var response = new object();
            var request = new PerformServiceRequest(header, "<string>");
            var responseCode = proxy.PerformService(request);

            Console.WriteLine("Response Code :" + responseCode.ToString());
            Console.WriteLine("Response :" + response.ToString());

        }
        catch (Exception exception)
        {
            Console.WriteLine(exception.Message);
        }

        Console.ReadLine(); // Pause
    }
}

我用占位符替换了一些敏感字符串。

问题可能完全在于我无法正确配置证书。最后,我希望从本地证书存储中加载它,因此我不必在代码或配置中指定密码。

LinePortType是基于本地WSDL的服务引用。因为WSDL是用于生产环境的,所以我将更改端点以引用UAT环境。


根据srsyogesh的建议,我已更新为使用WSHttpBinding,但我仍然遇到同样的错误。

try中的代码现在看起来像:

var binding = new WSHttpBinding();
binding.Security.Mode = SecurityMode.Transport;
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate;

var baseAddress = new Uri("https://<host>:<port>/<endpoint>");
var endpointAddress = new EndpointAddress(baseAddress);

var client = new LinePortTypeClient(binding, endpointAddress);

client.ClientCredentials.ClientCertificate.SetCertificate(StoreLocation.CurrentUser, StoreName.My, X509FindType.FindByIssuerName, "<issuername>");

var header = new ctSoapHeaderMsg();
var response = new object();
var responseCode = client.PerformTelstraSQ(ref header, "<string>", out response);

Console.WriteLine("Response Code :" + responseCode);
Console.WriteLine("Response :" + response);
答案

您不应该使用BasicHttpBinding,而是使用BasicHttpsBinding。它会解决我猜的问题。

另一答案

您可以将HTTPS与WsHttpBinding一起使用,而不是与BasicHttpBinding一起使用。确保使用您要使用的配置启动服务器,然后尝试从客户端进行连接。

以上是关于如何以编程方式为BasicHttpBinding指定HTTPS?的主要内容,如果未能解决你的问题,请参考以下文章

WCF路由如何以编程方式添加备份列表

从.NET调用WCF服务时如何以编程方式添加soap标头?

在 C# 中以编程方式创建 WCF 客户端的标头(wsse)部分

WCF系列 - WCF安全系列 - basicHttpBinding

如何以编程方式在 Access 中附加 DBF 文件?

我将如何以编程方式捕获内部音频?