【问题标题】:WCF Service works with HTTP but not with HTTPSWCF 服务适用于 HTTP,但不适用于 HTTPS
【发布时间】:2019-06-19 17:17:24
【问题描述】:

我已开发并发布了托管在 Azure 云服务(经典)中的 WCF 服务。我已安装证书并将云服务配置为使用该证书。这是从 CA 购买的证书,而不是自签名证书。我最初怀疑证书有问题,但正如 Steffen 在他的评论中指出的那样,情况似乎并非如此。我可以通过 HTTP 发送 POST 请求,并得到 200 响应。但是,如果我尝试通过 HTTPS 发送 POST 请求,我会收到 404 响应。这是两个请求之间的唯一区别。需要使用 HTTPS。

我已将 IIS 配置为为本地和远程调用发送详细的错误消息,但除了基本 404 之外,我仍然没有收到任何信息,未找到。

以下是服务定义 (.csdef) 文件中的绑定和端点部分。

<Bindings>
    <Binding name="HttpsIn" endpointName="HttpsIn" />
    <Binding name="Endpoint1" endpointName="Endpoint1" />
</Bindings>

<Endpoints>
    <InputEndpoint name="HttpsIn" protocol="https" port="443" certificate="mycertificate" />
    <InputEndpoint name="Endpoint1" protocol="http" port="80" />  
</Endpoints>

这里是 web.config 文件中的绑定部分:

    <bindings>
      <basicHttpBinding>
        <binding name="HttpsIn">
          <security mode="Transport"></security>
        </binding>
      </basicHttpBinding>
    </bindings>

这可行,返回 200 响应:

POST http://mydomain/myservice.svc HTTP/1.1
User-Agent: Fiddler
Host: mydomain
Content-Length: 600
Content-Type: text/xml; charset=utf-8
SOAPAction: "myclass/myaction"

<?xml version="1.0" etc, etc

失败,返回 404 响应:

POST https://mydomain/myservice.svc HTTP/1.1
User-Agent: Fiddler
Host: mydomain
Content-Length: 600
Content-Type: text/xml; charset=utf-8
SOAPAction: "myclass/myaction"

<?xml version="1.0" etc, etc

回复:

HTTP/1.1 404 Not Found
Server: Microsoft-IIS/10.0
X-Powered-By: ASP.NET
Date: Thu, 20 Jun 2019 09:40:02 GMT
Content-Length: 0

我尝试在下面进行亚伯拉罕·奎安建议的更改。我的服务配置主要如 Abraham 所示,除了它没有 aspNetCompatibilityEnabled 属性或 protocolMapping 部分,所以我添加了这些。我的 IIS 绑定如 Abraham 所示,但使用的是特定 IP 地址而不是“全部分配”,因此我也进行了更改。在这些更改之后,我得到了服务激活异常。错误消息表明 aspNetCompatibilityEnabled 属性存在问题,因此我再次将其取出。我现在在尝试远程浏览该站点时收到 503,服务不可用,但我在登录到服务器时能够浏览到该站点。这看起来可能是 IP 地址的问题,所以我更改了 IIS 绑定以再次使用特定的 IP 地址。我现在回到了我开始的地方 - 该服务通过 http 工作,但是当我尝试通过 https 调用它时得到 404。

总之,我可以使用 HTTP 或 HTTPS 在浏览器 (mydomain/myservice.svc?wsdl) 中显示 WSDL。我可以使用 HTTP 或 HTTPS 使用 GET 调用 SOAP 操作方法。这当然不会返回想要的结果,因为需要使用 POST 调用该方法,但它会返回“您已创建服务”页面的内容。 404 只发生在 HTTPS 和 POST 的组合中。

HTTP + GET = 200, 
HTTPS + GET = 200, 
HTTP + POST = 200, 
HTTPS + POST = 404.

【问题讨论】:

  • 这与 SSL 证书完全无关。 404 响应意味着该页面不存在 - 您在成功的 TLS 握手后得到此响应,即证书有效。为什么您的服务器在此特定请求上返回 404 尚不清楚,但它与证书无关。
  • 感谢 Steffen。我已编辑问题以考虑您的评论。
  • 您是否在 web.config 中指定了 &lt;security mode="Transport"&gt; ?你有谷歌 WCF Https 绑定吗?
  • 嗨,Thomas,是的,安全模式 = "Transport",是的,我用谷歌搜索过,但我当然不会声称自己了解我发现的所有内容。我将在问题中添加有关绑定的信息。

标签: azure wcf iis azure-cloud-services


【解决方案1】:

哥们,好像是通过https发布服务的过程有问题。
请使用以下配置启用 https 和 http。
服务器配置。

  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpsGetEnabled="true" httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
    <protocolMapping>
      <add scheme="https" binding="basicHttpsBinding"/>
      <add scheme="http" binding="basicHttpBinding"/>
    </protocolMapping>
  </system.serviceModel>

然后我们在 IIS 站点绑定模块中添加 http 绑定和 https 绑定。
IIS 站点绑定
必须注意的一点是,该服务不是 Restful,它只是在 SOAP 消息中工作。我们可以使用客户端代理来调用它。如下所示。
客户端。

ServiceReference1.Service1Client client = new ServiceReference1.Service1Client("BasicHttpsBinding_IService1");
            try
            {
                var result = client.GetData(34);
                Console.WriteLine(result);
            }
            catch (Exception)
            {
                throw;
            }

客户端配置。

    <system.serviceModel>
    <bindings>
        <basicHttpBinding>
            <binding name="BasicHttpBinding_IService1" />
            <binding name="BasicHttpsBinding_IService1">
                <security mode="Transport" />
            </binding>
        </basicHttpBinding>
    </bindings>
    <client>
        <endpoint address="http://vabqia969vm:11000/Service1.svc" binding="basicHttpBinding"
            bindingConfiguration="BasicHttpBinding_IService1" contract="ServiceReference1.IService1"
            name="BasicHttpBinding_IService1" />
        <endpoint address="https://vabqia969vm:11001/Service1.svc" binding="basicHttpBinding"
            bindingConfiguration="BasicHttpsBinding_IService1" contract="ServiceReference1.IService1"
            name="BasicHttpsBinding_IService1" />
    </client>
</system.serviceModel>

上面的客户端代理类(service1client)是通过在我的项目中添加服务引用生成的。
如果有什么我可以帮忙的,请随时告诉我。

【讨论】:

  • 嗨,亚伯拉罕。感谢那。我尝试进行指示的更改,但我现在收到 503,服务不可用错误。我将编辑问题以添加详细信息。
  • 你应用我的配置后,你能通过HTTPS访问下面的服务地址吗? mydomain/myservice.svc?wsdl 另外请开启windows功能以支持WCF。 i.stack.imgur.com/AEddz.png
  • 嗨,亚伯拉罕。在我删除 aspNetCompatibilityEnabled 属性之前,不,在我删除它之后,是的。重新启用 WCF 服务、HTTP 激活和 TCP 端口共享。我也启用了其他三个,但没有任何区别。我可以使用 HTTP 或 HTTPS 在浏览器中访问 WSDL。我可以使用 HTTP 或 HTTPS 使用 GET 调用 SOAP 操作方法(这会导致返回“您已创建服务”页面)。我可以使用 HTTP 通过 POST 调用 SOAP 操作方法并获得预期的响应。我只是无法使用 HTTPS 通过 POST 调用 SOAP 操作方法。
  • 错误详情是什么?通过添加服务引用调用服务时,是否可以在单独的项目中生成 https 服务端点?服务端和客户端建立信任关系了吗?如下所示,ServicePointManager.ServerCertificateValidationCallback += delegate { return true; };或者,我们可以在我们的 ROOT CA 中安装服务器证书。
  • 嗨,亚伯拉罕。目前没有细节,只有 404。我已经在问题中粘贴了完整的回复。或者您的意思是当存在 aspNetCompatibilityEnabled 属性时出现错误?如果您认为这会有所帮助,我可以获取该错误消息的详细信息。我将尝试单独的项目想法并报告。用于这些测试的“客户”是 Fiddler。我确实有一个测试客户端,它返回相同的 404 结果。我将在问题中添加处理证书验证的代码,因为评论有点长。
猜你喜欢
  • 2016-02-26
  • 2014-08-15
  • 1970-01-01
  • 2019-02-28
  • 2015-01-05
  • 2018-07-20
  • 2013-11-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多