通过Http和Https使用WCF调用Web服务

时间:2009-06-04 15:15:27

标签: asp.net wcf http https

在我们的项目中,我们有一个运行在http和https上的java Web服务。 我们希望内部使用http,并使用https作为我们网络应用程序的外部版本。

所以我们在应用程序中创建了代理类,我们在web / app.config中设置了http的绑定,一切正常。

我们需要对代码和配置进行哪些更改才能在外部应用程序中为同一服务支持https?如果可能的话请提供代码片段来解释!

4 个答案:

答案 0 :(得分:22)

我找到了一个围绕MSDN的答案。

就我而言,我使用的是自定义绑定:

<customBinding>
    <binding name="jsonpBinding">
        <jsonpMessageEncoding/>
        <httpTransport manualAddressing="true"/>
    </binding>
</customBinding>

在服务中引用了

<services>
    <service name="{YourInfoHere}">
        <endpoint address="" binding="customBinding" bindingConfiguration="jsonpBinding" behaviorConfiguration="{YourInfoHere}" contract="{YourInfoHere}"/>
    </service>
</services>

添加使用httpsTransport的第二个绑定,然后添加使用该绑定的第二个服务。最终输出:

    <services>
        <service name="{YourInfoHere}">
            <endpoint address="" binding="customBinding" bindingConfiguration="jsonpBinding" behaviorConfiguration="{YourInfoHere}" contract="{YourInfoHere}"/>
            <endpoint address="" binding="customBinding" bindingConfiguration="jsonpBindingHttps" behaviorConfiguration="{YourInfoHere}" contract="{YourInfoHere}"/>
        </service>
    </services>
    <bindings>
        <customBinding>
            <binding name="jsonpBinding">
                <jsonpMessageEncoding/>
                <httpTransport manualAddressing="true"/>
            </binding>
            <binding name="jsonpBindingHttps">
                <jsonpMessageEncoding/>
                <httpsTransport manualAddressing="true" />
            </binding>
        </customBinding>
    </bindings>

可能不太理想,但它确实有效。这些是我为使SSL工作所做的唯一更改。因为它全部都在绑定&amp;运输,代码保持不变。

相关的MSDN链接:

  1. 自定义绑定:http://msdn.microsoft.com/en-us/library/ms731377.aspx
  2. HttpTransport:http://msdn.microsoft.com/en-us/library/system.servicemodel.channels.httptransportbindingelement.aspx
  3. HttpsTransport:http://msdn.microsoft.com/en-us/library/system.servicemodel.channels.httpstransportbindingelement.aspx

答案 1 :(得分:2)

我假设你正在使用basichttpbinding。然后你需要做两件事:

  • 将地址更改为https:)
  • 将安全模式设置为传输

答案 2 :(得分:0)

请参阅Configuring HTTP and HTTPS

  

使用Windows Communication Foundation   (WCF)通过HTTP要么需要   使用主机,例如互联网   信息服务(IIS)或手册   HTTP设置的配置   通过HTTP Server API。这个   文档手动描述   使用HTTP和时配置WCF   HTTPS。

另见WCF Bindings Needed For HTTPS

  

我刚写完第一篇文章   生产WCF应用程序,其中   在我部署之前,我的工作非常顺利   到我们的生产环境。所有的   突然间没有一个WCF呼叫会   工作,我会得到一个JavaScript   “TestService未定义”错误。   当我查看JS服务时   参考(在调试模式下),我得到了   以下错误:

     

找不到与端点的scheme http匹配的基址   绑定WebHttpBinding。   注册的基地址方案是   [HTTPS]

     

显然我的WCF服务   将自己注册为HTTPS(因为它   是通过SSL),但我的绑定只是   为HTTP配置。解决方案是   在你的内部定义自定义绑定   Web.Config文件并设置安全性   模式为“运输”。那你就是   需要使用bindingConfiguration   端点内的属性   定义指向您的自定义   捆绑。整个启用HTTPS   system.serviceModel部分如下:

答案 3 :(得分:0)

我知道您正在使用WCF构建通过HTTPS连接到远程Web服务的客户端。

要执行此操作,只需在configuration/system.serviceModel/client/endpoint/@address中修改由WCF驱动的应用程序的客户端配置文件,将http://server.address替换为https://server.address。像这样:

<configuration>
  <system.serviceModel>
    ...
    <client>
        <!-- change only the address string -->
        <endpoint address="https://server.name/Whatever"
            everything.else.stays.the.same />

    </client>
  </system.serviceModel>
</configuration>

(配置文件的路径因常规.NET规则而异:无论是ASPNET应用程序还是服务等等。)

或者您可以在代码中明确设置地址:

    // instantiate new proxy to web service
    var svc= new ServiceClient();
    var e = svc.Endpoint;
    e.Address = new System.ServiceModel.EndpointAddress("https://server.address/JavaServiceUri");

我强烈建议您使地址可配置,而不是硬编码。这并不意味着它必须存储在app.config中,但它应该是可更改的。代理人也是。