WCF 方法 returns 400 错误的生产请求
WCF Method returns 400 Bad Request on Production
WCF REST 服务的方法正在使用 C# WCFClient 针对生产服务器。
他们还在本地主机上的开发环境中工作。
服务和 wsdl 在生产环境中也可以通过浏览器访问。
Access to svc
Access to wsdl
但是当我从生产服务器上的服务访问任何方法时,将返回 400 Bad Request。
IIS 日志也显示 400:GET /WCD/WCF.svc/GetNextGuestNumber - 443 - Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/83.0.4103.61+Safari/537.36 https://www.DS.XXX.com/qa/dLobby 400 0 0 46
这是我的 web.config 制作:
<?xml version="1.0"?>
<configuration>
<appSettings>
<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
<add key="WBCCNN" value="PQkSAXkRXNsanbA5xK1KBZZqu+oxrJbssQlEiM1Fi+N2Vnz0F5QfAetqILb0QeLwlF7jMZ57k9J8sIlAJ1TRjtfgwh0V88Q2Kl/20Cny2WCTawWyDSECKg=="/>
</appSettings>
<system.web>
<compilation debug="false" targetFramework="4.5" />
<httpRuntime targetFramework="4.5"/>
</system.web>
<system.serviceModel>
<services>
<service name="DS.XXX.Services.WCF" behaviorConfiguration="DSServiceBehavior">
<endpoint address=""
binding="basicHttpBinding"
bindingConfiguration="secureHttpBinding"
contract="DS.XXX.Services.IWCF"/>
<endpoint address="mex"
binding="mexHttpsBinding"
contract="IMetadataExchange" />
</service>
</services>
<bindings>
<basicHttpBinding>
<binding name="secureHttpBinding">
<security mode="Transport">
</security>
</binding>
</basicHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="DSServiceBehavior">
<serviceMetadata httpsGetEnabled="true" httpsGetUrl="" />
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>
</configuration>
这些方法是从带有 Axios 的 REACT JS 应用程序调用的
const res = await API.get("/GetNextGuestNumber");
Axios 的 API 配置如下:
import axios from "axios";
import global from "../config";
export default axios.create({
baseURL: global.webServicesUrl,
headers: { "Content-Type": "application/json" }
});
由于服务在 dev 上运行,svc 和 wsdl 可在 prod 上访问,它必须具有绑定和端点配置?
我使用的是来自第三方供应商的证书,该证书也工作正常。
我没看到。任何帮助表示赞赏。如果您需要更多详细信息,请告诉我。
环境:Windows Server 2016,IIS
绑定有误。您应该使用 webhttpbinding 构建 WCF REST 服务,但我在配置文件中看到您使用 basichttpbinding.In 这种情况,当您使用 JS 访问该服务时,您将收到 400 错误。
<services>
<service name="Demo_rest_IIS.Service1"
behaviorConfiguration="UserServiceBehavior">
<endpoint address=""
binding="webHttpBinding"
contract="Demo_rest_IIS.IService1"
behaviorConfiguration="ESEndPointBehavior" bindingConfiguration="bind"/>
</service>
</services>
<behaviors>
<endpointBehaviors>
<behavior name="ESEndPointBehavior">
<webHttp helpEnabled="true"/>
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behavior name="UserServiceBehavior">
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
这是我在IIS中部署的WCF rest服务的配置文件。
[OperationContract]
[WebGet(UriTemplate = "user/?name={name}",RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
Result GetUserData(string name);
[OperationContract]
[WebInvoke(UriTemplate = "user", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
Result PostUserData(UserData user);
[OperationContract]
[WebInvoke(Method = "PUT", UriTemplate = "user", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
Result PutUserData(UserData user);
[OperationContract]
[WebInvoke(Method = "DELETE", UriTemplate = "user", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
Result DeleteUserData(UserData user);
这是service.In配置文件的界面,我把helpenabled的值设置为true。部署好服务后,我们通过帮助文档看看如何访问。
这是该服务的帮助文档。
更多关于WCF REST Service的内容,请参考以下内容link:
https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/wcf-web-http-programming-model
WCF REST 服务的方法正在使用 C# WCFClient 针对生产服务器。 他们还在本地主机上的开发环境中工作。 服务和 wsdl 在生产环境中也可以通过浏览器访问。
Access to svc
Access to wsdl
但是当我从生产服务器上的服务访问任何方法时,将返回 400 Bad Request。 IIS 日志也显示 400:GET /WCD/WCF.svc/GetNextGuestNumber - 443 - Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/83.0.4103.61+Safari/537.36 https://www.DS.XXX.com/qa/dLobby 400 0 0 46
这是我的 web.config 制作:
<?xml version="1.0"?>
<configuration>
<appSettings>
<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
<add key="WBCCNN" value="PQkSAXkRXNsanbA5xK1KBZZqu+oxrJbssQlEiM1Fi+N2Vnz0F5QfAetqILb0QeLwlF7jMZ57k9J8sIlAJ1TRjtfgwh0V88Q2Kl/20Cny2WCTawWyDSECKg=="/>
</appSettings>
<system.web>
<compilation debug="false" targetFramework="4.5" />
<httpRuntime targetFramework="4.5"/>
</system.web>
<system.serviceModel>
<services>
<service name="DS.XXX.Services.WCF" behaviorConfiguration="DSServiceBehavior">
<endpoint address=""
binding="basicHttpBinding"
bindingConfiguration="secureHttpBinding"
contract="DS.XXX.Services.IWCF"/>
<endpoint address="mex"
binding="mexHttpsBinding"
contract="IMetadataExchange" />
</service>
</services>
<bindings>
<basicHttpBinding>
<binding name="secureHttpBinding">
<security mode="Transport">
</security>
</binding>
</basicHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="DSServiceBehavior">
<serviceMetadata httpsGetEnabled="true" httpsGetUrl="" />
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>
</configuration>
这些方法是从带有 Axios 的 REACT JS 应用程序调用的
const res = await API.get("/GetNextGuestNumber");
Axios 的 API 配置如下:
import axios from "axios";
import global from "../config";
export default axios.create({
baseURL: global.webServicesUrl,
headers: { "Content-Type": "application/json" }
});
由于服务在 dev 上运行,svc 和 wsdl 可在 prod 上访问,它必须具有绑定和端点配置?
我使用的是来自第三方供应商的证书,该证书也工作正常。 我没看到。任何帮助表示赞赏。如果您需要更多详细信息,请告诉我。
环境:Windows Server 2016,IIS
绑定有误。您应该使用 webhttpbinding 构建 WCF REST 服务,但我在配置文件中看到您使用 basichttpbinding.In 这种情况,当您使用 JS 访问该服务时,您将收到 400 错误。
<services>
<service name="Demo_rest_IIS.Service1"
behaviorConfiguration="UserServiceBehavior">
<endpoint address=""
binding="webHttpBinding"
contract="Demo_rest_IIS.IService1"
behaviorConfiguration="ESEndPointBehavior" bindingConfiguration="bind"/>
</service>
</services>
<behaviors>
<endpointBehaviors>
<behavior name="ESEndPointBehavior">
<webHttp helpEnabled="true"/>
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behavior name="UserServiceBehavior">
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
这是我在IIS中部署的WCF rest服务的配置文件。
[OperationContract]
[WebGet(UriTemplate = "user/?name={name}",RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
Result GetUserData(string name);
[OperationContract]
[WebInvoke(UriTemplate = "user", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
Result PostUserData(UserData user);
[OperationContract]
[WebInvoke(Method = "PUT", UriTemplate = "user", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
Result PutUserData(UserData user);
[OperationContract]
[WebInvoke(Method = "DELETE", UriTemplate = "user", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
Result DeleteUserData(UserData user);
这是service.In配置文件的界面,我把helpenabled的值设置为true。部署好服务后,我们通过帮助文档看看如何访问。
这是该服务的帮助文档。
更多关于WCF REST Service的内容,请参考以下内容link:
https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/wcf-web-http-programming-model