我是WCF Web Service的新手,并且不太了解如何调试Web服务......
以下示例中,我创建了一个Web服务,其界面如下:
public interface IMyService
{
[OperationContract]
[WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest)]
List<MyClass> GetData(string param);
}
以及返回MyClass列表的实现。
部署之后,我在Fiddler中调用了这个服务,如
http://localhost/MyService.svc/GetData?keyword=blabla
它返回:
HTTP/1.1 401 Unauthorized
Server: Microsoft-IIS/7.5
SPRequestGuid: blabla
WWW-Authenticate: blabla
X-Powered-By: ASP.NET
MicrosoftSharePointTeamServices: 14.0.0.6114
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST, GET, OPTIONS
Date: Mon, 12 Nov 2012 17:24:08 GMT
Content-Length: 0
如果我只是写作曲:
http://localhost/MyService.svc/GetData
没有param,它返回状态为200的非空json。
当我在Chrome中尝试第一个请求时,它连续要求我输入服务器的用户名和密码,但输入它们并没有帮助我摆脱循环(要求用户名和密码)。
有没有人遇到这样的问题? 或者您可以对调试提出任何建议吗?
答案 0 :(得分:0)
WCF服务通常不允许开箱即用的GET访问。为了平息我自己的答案(这里:https://stackoverflow.com/a/13229373/1014822)你需要web.config中的配置部分看起来像这样:
<bindings>
<webHttpBinding>
<binding name="crossDomain" crossDomainScriptAccessEnabled="true" />
</webHttpBinding>
</bindings>
<behaviors>
<endpointBehavior>
<behavior name="restBehavior">
<webHttp />
</behavior>
</endpointBehavior>
<serviceBehavior>
<behavior name="MyServiceBehavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehavior>
</behaviors>
<services>
<service name="..." behaviorConfiguration="MyServiceBehavior">
<endpoint address="" binding="webHttpBinding" bindingConfiguration="crossDomain"
contract="..." behaviorConfigurations="restBehavior" />
</service>
</services>
您可能不需要跨域元素,但至少需要允许<webHttp />
的端点行为和允许<serviceMetadata httpGetEnabled="true" />
的服务行为。您无法拥有无配置服务 - 您需要<service/>
元素才能绑定这些行为。您需要填写<service/>
元素,其中包含您的服务名称和合同的接口名称(例如IMyService
)
如果您只是通过GET进行测试,因为它更容易做,但会在您的实际应用中使用POST(或http以外的某些协议),那么您可能会考虑使用WCF测试客户端进行调试,而不是浏览器和/或小提琴手。此处客户的详细信息:http://msdn.microsoft.com/en-us/library/bb552364.aspx