SharePoint Foundation 2010中的SVC提供HTTP 400:错误请求

时间:2011-11-16 16:24:47

标签: wcf sharepoint sharepoint-2010

一点背景知识。我曾与ASMX和PageMethods合作,但到目前为止还没有WCF。我正在开发Win 7 Pro,安装了Windows Communication Foundation HTTP Activation以及安装了Windows Communication Foundation HTTP Non-Activation。我还部署到也在我的计算机上运行的SharePoint Foundation 2010。

我正在为正在访问非SharePoint数据的SharePoint开发自定义Web服务。我发现了几篇关于在SharePoint中创建WCF服务的文章。我按照这个中的说明http://answers.oreilly.com/topic/1404-how-to-customize-wcf-services-in-sharepoint-2010

我可以加载MEX,例如http://mySite.com/Services/MyService.svc/MEX,但如果我转到http://mySite.com/Services/MyService.svc,我会收到HTTP 400错误请求。

查看事件查看器日志,没有任何与此错误相关的信息。 IIS日志仅显示服务的GET。

我认为它未正确部署或存在一些权限问题。

5 个答案:

答案 0 :(得分:7)

我遇到了与开发REST服务时描述的问题相同的问题。解决方案是将Factory更改为用于REST服务的 MultipleBaseAddressWebServiceHostFactory ,而不是用于 MultipleBaseAddressBasicHttpBindingServiceHostFactory 的工厂SOAP服务。

例如在.svc文件中:

<%@ ServiceHost Language="C#" Debug="true"
Service="MyProject.WCFService1, $SharePoint.Project.AssemblyFullName$"  
CodeBehind="WCFService1.svc.cs"
Factory="Microsoft.SharePoint.Client.Services.MultipleBaseAddressWebServiceHostFactory, Microsoft.SharePoint.Client.ServerRuntime, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>

以下是您可以使用的不同类型工厂的描述,provided by Andy Kinnear

  • <强> MultipleBaseAddressBasicHttpBindingServiceHostFactory

    用于 SOAP服务。必须使用基本的HTTP绑定,它基于基本的HTTP绑定为服务创建端点。

  • <强> MultipleBaseAddressWebServiceHostFactory

    用于 REST服务。服务工厂使用Web绑定创建端点。

  • MultipleBaseAddressDataServiceHostFactory

    用于 ADO.NET数据服务。可以使用数据服务主机工厂。

答案 1 :(得分:0)

.config文件(或等效代码)中有httpGetEnabled吗?

<system.serviceModel>
  <behaviors>
    <serviceBehaviors>
      <behavior>
        <serviceMetadata httpGetEnabled="true"/>
      </behavior>
    </behaviors>
  </serviceBehaviors>
</system.serviceModel>

参考:http://msdn.microsoft.com/en-us/library/system.servicemodel.description.servicemetadatabehavior.httpgetenabled.aspx

答案 2 :(得分:0)

据我所知,这不是问题(当你访问.svc时获取HTTP 400但访问/ mex时没有获得)。
我遇到了同样的问题,我的SharePoint WCF服务正常运行。尝试从一个简单的控制台应用程序调用您的服务,它将工作,例如
SomeServiceClient proxy = new SomeServiceClient(new BasicHttpBinding(), new EndpointAddress("http://server/_vti_bin/YourService.svc"));

答案 3 :(得分:0)

只是建议我建议您使用CKSDevs Tools它有许多标准共享点元素的模板,包括WCF服务。

而且我也没有看到这里的问题,你说端点的工作正常。你期望在/MyService.svc上看到什么?你很简单,不会将任何查询传递给服务,因此它不知道该做什么并抛出400。

答案 4 :(得分:0)