WCF Web服务WebInvoke操作返回401未授权

时间:2012-11-12 17:29:33

标签: asp.net wcf web-services visual-studio

我是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中尝试第一个请求时,它连续要求我输入服务器的用户名和密码,但输入它们并没有帮助我摆脱循环(要求用户名和密码)。

有没有人遇到这样的问题? 或者您可以对调试提出任何建议吗?

1 个答案:

答案 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