配置以在Azure Web角色上启用HTTPS WCF Web服务

时间:2014-04-09 11:09:03

标签: wcf azure

我搜索了与此区域相关的几个帖子(例如herehere),但似乎都没有解决这个相当直接的场景问题:应该使用哪些Binding配置在Azure Web角色上配置启用SSL(例如https)的WCF Web服务:在Web角色的ServiceDefinition.csdef中,Web服务的web.config和客户端的app.config?

我已经在Azure门户和Web角色的ServiceConfiguration.csfg中为https:// MyApp.cloudapp.net配置了服务的SSL证书,这似乎工作正常。

当我浏览服务https:// myapp.cloudapp.net/WCFService.svc?wsdl时,元数据会正确显示。我可以从客户端向服务添加服务引用,但是当我调用它时,我得到异常:“没有端点监听https:// myapp.cloudapp.net/WCFService.svc可以接受该消息。这通常是由错误的地址或SOAP操作引起的。有关更多详细信息,请参阅InnerException(如果存在)。“内部异常:”远程服务器返回错误:(404)Not Found“

各个配置文件如下所示: ServiceDefinition.csdef:

<WebRole name="WCFServiceWebRole" vmsize="Small">
    <Sites>
      <Site name="Web">
        <Bindings>
          <Binding name="HttpIn" endpointName="HttpIn" />
          <Binding name="HttpsIn" endpointName="HttpsIn" />
        </Bindings>
      </Site>
    </Sites>
    <Endpoints>
      <InputEndpoint name="HttpIn" protocol="http" port="8080" />
      <InputEndpoint name="HttpsIn" protocol="https" port="443" certificate="MySSLCert" />
    </Endpoints>
    <Certificates>
      <Certificate name="MySSLCert" storeLocation="LocalMachine" storeName="My" />
    </Certificates>
  </WebRole>

Web Service的web.config:

<system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>              
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
    <bindings>
      <basicHttpBinding>
        <binding name="BasicHttpBinding" />
          <security mode="Transport">
            <transport clientCredentialType="None" />
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
  </system.serviceModel>

客户的App.Config如下所示:

<system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_IMyWebService" >
                 <security mode="Transport">
                    <transport clientCredentialType="None" />
                 </security>
             </binding>
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint address="https://myapp.cloudapp.net/MyWebService.svc"
                binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IMyWebService"
                contract="MyWebServiceServiceReference.IMyWebService"
                name="BasicHttpBinding_IMyWebService" />
        </client>
    </system.serviceModel>

当我使用SvcUtil为客户端生成绑定配置时,它会生成:

<system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_IMyWebService" closeTimeout="00:01:00"
                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                    allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                    maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                    messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
                    useDefaultWebProxy="true">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <security mode="None">
                        <transport clientCredentialType="None" proxyCredentialType="None"
                            realm="" />
                        <message clientCredentialType="UserName" algorithmSuite="Default" />
                    </security>
                </binding>
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint address="https://myapp.cloudapp.net/MyWebService.svc"
                binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IMyWebService"
                contract="MyWebServiceServiceReference.IMyWebService" name="BasicHttpBinding_IMyWebService" />
        </client>
    </system.serviceModel>

然后在我调用Web服务时给出异常:“提供的URI方案'https'无效;预期'http'。”所以这似乎也不是正确的配置。

我确定这只是在上面三个文件中获得正确配置的问题,但我似乎无法在任何地方找到正确的组合,所以我真的很感激如果有人能够说出他们应该做什么是。 康纳尔。

2 个答案:

答案 0 :(得分:4)

Azure开发帮助我找到答案,问题是从Web服务的web.config文件中省略了Service节点。以下是此方案所需的完整配置文件集,以防其他人尝试实现相同的结果(在Azure Web角色上实现SSL / HTTPS WCF Web服务:

ServiceDefinition.csdef:

<WebRole name="WCFServiceWebRole" vmsize="Small">
    <Sites>
      <Site name="Web">
        <Bindings>
          <Binding name="HttpIn" endpointName="HttpIn" />
          <Binding name="HttpsIn" endpointName="HttpsIn" />
        </Bindings>
      </Site>
    </Sites>
    <Endpoints>
      <InputEndpoint name="HttpIn" protocol="http" port="8080" />
      <InputEndpoint name="HttpsIn" protocol="https" port="443" certificate="MySSLCert" />
    </Endpoints>
    <Certificates>
      <Certificate name="MySSLCert" storeLocation="LocalMachine" storeName="My" />
    </Certificates>
  </WebRole>

Web Service的web.config:

<system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>              
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
    <bindings>
      <basicHttpBinding>
        <binding name="BasicHttpBinding" />
          <security mode="Transport">
            <transport clientCredentialType="None" />
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
    <services>
      <service behaviorConfiguration="" name="MyWebServiceNameSpace.MyWebService">
      <endpoint bindingConfiguration="BasicHttpBinding" address="" binding="basicHttpBinding"
    contract="MyWebServiceNameSpace.IMyWebService" />
      <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" />
     </service>
   </services>
  </system.serviceModel>

客户的App.Config如下所示:

<system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_IMyWebService" >
                 <security mode="Transport">
                    <transport clientCredentialType="None" />
                 </security>
             </binding>
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint address="https://myapp.cloudapp.net/MyWebService.svc"
                binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IMyWebService"
                contract="MyWebServiceServiceReference.IMyWebService"
                name="BasicHttpBinding_IMyWebService" />
        </client>
    </system.serviceModel>

答案 1 :(得分:0)

谢谢,也为我工作! 我做了一些更改,删除了服务定义中的“证书”部分。

<WebRole name="WCFServiceBizagiCloud" vmsize="Standard_D1_v2">
    <Sites>
      <Site name="Web">
        <Bindings>
          <!--<Binding name="Endpoint1" endpointName="Endpoint1" />-->
          <Binding name="HttpIn" endpointName="HttpIn" />
          <Binding name="HttpsIn" endpointName="HttpsIn" />
        </Bindings>
      </Site>
    </Sites>
    <ConfigurationSettings>
      <Setting name="Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString" />
    </ConfigurationSettings>
    <Endpoints>
      <!--<InputEndpoint name="Endpoint1" protocol="http" port="80" />-->
      <InputEndpoint name="HttpIn" protocol="http" port="8080" />
      <InputEndpoint name="HttpsIn" protocol="https" port="443"  />
    </Endpoints>
    <!--<Certificates>
      <Certificate name="MySSLCert" storeLocation="LocalMachine" storeName="My" />
    </Certificates>-->
  </WebRole>