.Net C# WebService HTTPS返回404、HTTP返回400,如何统一响应?
问题分析与解决方案
我来帮你梳理下当前问题的核心原因和具体修复步骤:你的WebService配置只针对HTTP协议做了适配,完全没覆盖HTTPS场景,同时元数据发布、端点绑定都没跟上双协议的要求,这才导致两种协议下请求都出错:
- HTTP返回400:大概率是请求格式/路径和REST端点的预期不匹配,加上基础绑定配置不够完整;
- HTTPS返回404:因为没有配置对应HTTPS的服务端点,IIS收到请求后找不到匹配的处理节点,直接返回404。
下面是针对你的web.config的具体修改方案,按步骤调整即可:
1. 补充HTTPS对应的绑定配置
在<bindings>节点里,为REST用的webHttpBinding和SOAP用的basicHttpBinding分别添加HTTPS版本的安全绑定:
<bindings> <!-- 保留原有的HTTP版webHttpBinding配置 --> <webHttpBinding> <binding name="webHttpBindingWithJsonP" closeTimeout="00:10:00" openTimeout="00:10:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" crossDomainScriptAccessEnabled="true"/> <!-- 新增HTTPS版webHttpBinding --> <binding name="webHttpBindingHttps" closeTimeout="00:10:00" openTimeout="00:10:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" crossDomainScriptAccessEnabled="true"> <security mode="Transport"> <transport clientCredentialType="None"/> </security> </binding> </webHttpBinding> <!-- 新增basicHttpBinding的HTTP和HTTPS版本 --> <basicHttpBinding> <binding name="basicHttpBindingHttp"/> <binding name="basicHttpBindingHttps"> <security mode="Transport"> <transport clientCredentialType="None"/> </security> </binding> </basicHttpBinding> <!-- 原wsHttpBinding配置可保留,若不用也可删除 --> <wsHttpBinding> <binding name="TransportSecurity"> <security mode="Transport"> <transport clientCredentialType="None"/> </security> </binding> </wsHttpBinding> </bindings>
2. 添加HTTPS对应的服务端点
在<services>节点里,为服务补充HTTPS版本的REST端点、SOAP端点,以及HTTPS元数据端点:
<services> <service name="RestService.RestServiceImpl" behaviorConfiguration="ServiceBehaviour"> <!-- HTTP版REST端点 --> <endpoint address="" binding="webHttpBinding" bindingConfiguration="webHttpBindingWithJsonP" contract="RestService.IRestServiceImpl" behaviorConfiguration="web"/> <!-- HTTPS版REST端点 --> <endpoint address="" binding="webHttpBinding" bindingConfiguration="webHttpBindingHttps" contract="RestService.IRestServiceImpl" behaviorConfiguration="web"/> <!-- HTTP版SOAP端点 --> <endpoint address="basic" binding="basicHttpBinding" bindingConfiguration="basicHttpBindingHttp" name="HttpEndPoint" contract="RestService.IRestServiceImpl"/> <!-- HTTPS版SOAP端点 --> <endpoint address="basic" binding="basicHttpBinding" bindingConfiguration="basicHttpBindingHttps" name="HttpsEndPoint" contract="RestService.IRestServiceImpl"/> <!-- HTTP元数据端点 --> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> <!-- HTTPS元数据端点 --> <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange"/> </service> </services>
注:把原来的
Service1.svc元数据地址改成mex更规范,同时必须添加HTTPS版的元数据端点,否则HTTPS下无法获取服务元数据。
3. 修改服务行为,开启HTTPS元数据发布
在<serviceBehaviors>的ServiceBehaviour里,同时开启HTTP和HTTPS的元数据获取权限:
<serviceBehaviors> <behavior name="ServiceBehaviour"> <!-- 同时开启HTTP和HTTPS的元数据访问 --> <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/> <serviceDebug includeExceptionDetailInFaults="true"/> </behavior> </serviceBehaviors>
4. 最后检查IIS配置
- 确认站点同时绑定了HTTP(80端口)和HTTPS(443端口),且HTTPS绑定关联了正确的SSL证书;
- 确保应用程序池的.NET版本设置为4.0,和你的服务targetFramework匹配。
修改完成后重启IIS站点,再测试双协议请求:
- REST接口:HTTP/HTTPS访问都能正常响应,如果还有400错误,要检查请求的URL、HTTP方法和参数是否符合
IRestServiceImpl的接口定义; - SOAP接口:HTTP访问
http://你的域名/basic、HTTPS访问https://你的域名/basic,都能正常获取WSDL; - 元数据:HTTP访问
http://你的域名/mex、HTTPS访问https://你的域名/mex,都能正常获取服务元数据。
内容的提问来源于stack exchange,提问作者Muhammad Ali Khan
相关产品推荐
相关产品推荐

