我有一个WCF Web服务,可以通过调试器在我的本地计算机上运行,并作为服务安装在IIS上。
当我在GoDaddy主机上安装它时,此Web服务失败。不执行函数开头的日志记录调用,浏览器收到400 /错误请求响应。
与此工作一起编译的其他服务按预期方式进行,因此不是Connection String,web.config等问题。
调用服务的URL很简单" GET"拨打:
http://tucansdev.com/TalLimoService.svc/GetTransportationOffers/1,2,1410885561,false
操作合同如下所示:
[OperationContract]
[WebInvoke(Method = "GET",
ResponseFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.Wrapped,
UriTemplate = "GetTransportationOffers/{pickupLocID},{dropoffLocID},{pickupTime},{isAsInstructed}")]
List<GetTransportationOffersResult> GetTransportationOffers(string pickupLocID, string dropoffLocID, string pickupTime, string isAsInstructed);
GoDaddy服务器上的日志确认已收到呼叫这一事实,但仅此而已。
为了彻底,这是我在web.config中的服务模型:
<system.serviceModel>
<services>
<service name="TalLimoService.TalLimoService" behaviorConfiguration="ServiceBehavior">
<!--Service Endpoints-->
<!-- Unless fully qualified, address is relative to base address supplied above-->
<endpoint address="" binding="webHttpBinding" contract="TalLimoService.ITalLimoService" behaviorConfiguration="web"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="ServiceBehavior">
<!-- To avoid disclosing metadata information, set the values below to false before deployment -->
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
<!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information -->
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="web">
<webHttp/>
</behavior>
</endpointBehaviors>
</behaviors>
<protocolMapping>
<add binding="basicHttpsBinding" scheme="https"/>
</protocolMapping>
<serviceHostingEnvironment aspNetCompatibilityEnabled="false" multipleSiteBindingsEnabled="true"/>
更糟糕的是,它曾经有效。我将第三个参数从显式日期更改为时间标记,据我所知,这不会影响界面。当我恢复旧版本时,我仍然得到400响应,所以我猜这不是代码。它是什么?
下一步
由于它曾经工作,我将代码简化为一个完全无关紧要的界面,然后没有任何问题。然后我将所有参数恢复到端点,但是使用空函数。 函数的前两行看起来像这样:
List<GetTransportationOffersResult> transList = new List<GetTransportationOffersResult>();
TalLimoDataDataContext tlData = new TalLimoDataDataContext();
当函数只有第一行时,一切都很好。第二行导致服务返回错误400.然后我会说我的.dbml文件有问题,但是这个Web服务中的其他函数进行相同的调用,并且没有问题!
答案 0 :(得分:0)
事实证明问题出在web.config文件中。在我的机器上我有:
<connectionStrings>
<add name="DataSourceConnectionString"...
并且在服务器上,由于某种原因,它是
<connectionStrings>
<add name="TalLimoConnectionString"...
所以在我的机器上它起作用了,而在服务器上却没有。我想这个故事的寓意永远不会假设任何东西。