在IIS中托管wcf服务时无法访问REST方法

时间:2010-07-12 18:19:22

标签: wcf rest iis-7 webget

我有一个WCF REST服务,它公开GreetService类中的方法:

[ServiceContract]
public class GreetService
{
    [WebGet(UriTemplate = "greet/{name}")]
    public String GreetName(string name)
    {
        return "Hello " + name;
    }
}

另外,我在Global.asax注册了一条路线:

RouteTable.Routes.Add(new ServiceRoute("GreetService", new WebServiceHostFactory(), typeof(GreetService)));

现在当我直接从visual studio运行它时,我能够利用UriTemplate并使用GET调用来调用此方法 http://localhost:5432/GreetService/greet/JohnDoe

但是,通过为它创建Greet.svc文件将其部署到IIS7后,我观察到以下行为:

为什么WebGetAttribute无法在IIS中运行?或者还有其他我做错了吗?

编辑: 这是我的web.config文件的ServiceModel部分,它驻留在IIS使用的目录中:

<system.serviceModel>
    <!-- <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/> -->
    <standardEndpoints>
      <webHttpEndpoint>
        <!-- 
        Configure the WCF REST service base address via the global.asax.cs file and the default endpoint 
        via the attributes on the <standardEndpoint> element below
        -->
        <standardEndpoint name="" helpEnabled="true" automaticFormatSelectionEnabled="true" />
      </webHttpEndpoint>
    </standardEndpoints>
</system.serviceModel>

编辑2:为了完整起见,这里是我的完整web.config文件:

<?xml version="1.0"?>
<configuration>

  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>

  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
      <add name="UrlRoutingModule"
           type="System.Web.Routing.UrlRoutingModule,
           System.Web, Version=4.0.0.0,
           Culture=neutral,
           PublicKeyToken=b03f5f7f11d50a3a" />
    </modules>
    <handlers>
      <add name="UrlRoutingHandler"
         preCondition="integratedMode"
         verb="*" path="UrlRouting.axd"
         type="System.Web.HttpForbiddenHandler, 
         System.Web, Version=4.0.0.0, Culture=neutral, 
         PublicKeyToken=b03f5f7f11d50a3a" />
    </handlers>
  </system.webServer>

  <system.serviceModel>
     <!--<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>--> 
    <standardEndpoints>
      <webHttpEndpoint>
        <!-- 
            Configure the WCF REST service base address via the global.asax.cs file and the default endpoint 
            via the attributes on the <standardEndpoint> element below
        -->
        <standardEndpoint name="" helpEnabled="true" automaticFormatSelectionEnabled="true" />
      </webHttpEndpoint>
    </standardEndpoints>
  </system.serviceModel>

</configuration>

4 个答案:

答案 0 :(得分:1)

如果您已将路线定义为:

new ServiceRoute("GreetService", .....

那么你应该能够在

打电话给你的服务
http://localhost:5432/YourVirtualDirectory/GreetService/greet/JohnDoe

如果您的Web应用程序部署到您的IIS根目录(而不是虚拟目录),那将是:

http://localhost:5432/GreetService/greet/JohnDoe

在定义ServiceRoute时,为了摆脱必须指定Greet.svc文件,确实 - ServiceRoute条目已包含IIS实例化服务并调用它所需的所有信息 - 否需要在您的URL中包含* .svc文件(svc文件基本上包含您ServiceRoute条目所具有的相同信息。)

答案 1 :(得分:1)

global.asax.cs中的行更改为:

RouteTable.Routes.Add(new ServiceRoute("", new WebServiceHostFactory(), typeof(GreetService)));

并将以下内容放在根web.config节点下的<configuration>右侧:

  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
      <add name="UrlRoutingModule"
           type="System.Web.Routing.UrlRoutingModule, 
          System.Web.Routing, Version=4.0.0.0, 
          Culture=neutral, 
          PublicKeyToken=31BF3856AD364E35" />

    </modules>
    <handlers>
      <add name="UrlRoutingHandler"
         preCondition="integratedMode"
         verb="*" path="UrlRouting.axd"
         type="System.Web.HttpForbiddenHandler, 
         System.Web, Version=4.0.0.0, Culture=neutral, 
         PublicKeyToken=b03f5f7f11d50a3a" />
    </handlers>
  </system.webServer>

(确保您使用的是正确的.NET版本)并查看它对您的作用。

答案 2 :(得分:1)

注意:请发布web.config,至少发布system.servicemodel部分。

您通常使用基于路由的配置或.svc文件,而不是两者,但这与您的问题正交。 FWIW,你应该能够在服务正常工作后杀死.svc文件并使用该路由。

既然你能够生成WSDL并调用它,那听起来你可能没有webhttp作为端点行为吗?

确保您有一个像这样定义的端点行为(当然可以是差异名称)

    <endpointBehaviors> 
        <behavior name="webHttpBehavior"> 
            <webHttp /> 
        </behavior> 
    </endpointBehaviors> 

然后确保您的服务端点包含behaviorConfiguration =“webHttpBehavior”

答案 3 :(得分:0)

问题是机器配置缺少以下部分

<configSections>
    <sectionGroup name="system.serviceModel" type="System.ServiceModel.Configuration.ServiceModelSectionGroup, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
        <section name="standardEndpoints" type="System.ServiceModel.Configuration.StandardEndpointsSection, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
    </sectionGroup>
</configSections>

在web.config之上添加它(在<configuration>的开头标记之后)应解决此问题。