【问题标题】:WCF Web Service WebInvoke Operation Returns 401 UnauthorizedWCF Web 服务 WebInvoke 操作返回 401 Unauthorized
【发布时间】:2012-11-01 03:46:35
【问题描述】:

我是 WCF Web 服务的新手,不太了解如何调试 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

如果没有参数,它会返回状态为 200 的空 json。

当我在 Chrome 中尝试第一个请求时,它连续向服务器要求我的用户名和密码,但输入它们并没有帮助我摆脱(要求用户名和密码的循环)。

有人遇到过这样的问题吗? 或者你能对调试有什么建议吗?

【问题讨论】:

  • 请发布您的 web.config 文件的相关部分。正确的配置是让 WCF 服务正常工作的主要部分,尤其是当您尝试通过 GET 访问时。
  • @JcFx 我在效仿其他人的例子,奇怪的是,web.config 中没有相关部分,以及许多其他服务......
  • 如果您要通过 GET 访问该服务,那么您将需要一些配置。在这里查看我的答案:stackoverflow.com/questions/13228995/…您至少需要&lt;serviceMetadata httpGetEnabled="true" /&gt;的服务行为
  • 仅供参考,请注意我如何编辑您的标题以实际向读者提供一些信息。

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


【解决方案1】:

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>

您可能不需要跨域元素,但您至少需要允许&lt;webHttp /&gt; 的端点行为和允许&lt;serviceMetadata httpGetEnabled="true" /&gt; 的服务行为。然后您就不能拥有无配置服务 - 您需要 &lt;service/&gt; 元素才能绑定这些行为。您将需要使用您的服务名称和合同的接口名称(例如 IMyService)来完成 &lt;service/&gt; 元素

如果您只通过 GET 进行测试,因为它更容易执行,但会在实际应用中使用 POST(或 http 以外的其他协议),那么您可以考虑使用 WCF 测试客户端进行调试,而不是使用浏览器和/或提琴手。客户详情在这里:http://msdn.microsoft.com/en-us/library/bb552364.aspx

【讨论】:

  • 非常感谢您的详细解答!但是,在我在 app.config 中添加绑定、服务行为和服务之后,一切都照常进行。我还尝试了 WCF 测试客户端,但它显示“无法获取元数据”。即使我尝试了其他适用于 Fiddler 的服务,它在这里也不起作用 =(
  • 嗯,这是一个更有用的错误信息。有关“无法获取元数据”的一些原因,请参见此处:stackoverflow.com/questions/9114870/… 另外,如果您只是尝试访问此 url:localhost/MyService.svc(没有方法调用)会发生什么?
  • 没有方法调用它不起作用。我认为我的 IIS 或配置一定有问题。但是,在我的同事的帮助下,问题得到了解决……我的班级似乎没有被 IIS 识别……通过在定义中添加 [ServiceKnowType(typeof(MyClass))] 以及 [DataMember] 和 [DataContract] MyClass 终于成功了=)
  • 听起来你有不止一个问题 - 没有 ServiceKnowType 不应该导致 HTTP 401(我认为更像是 500)。无论如何:我很高兴它已修复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多