1

我有一个 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 并使用对 http://localhost:5432/GreetService/greet/JohnDoe的 GET 调用来调用此方法

但是,通过为其创建 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

4 回答 4

1

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

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

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

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

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

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

于 2010-07-13T16:19:23.703 回答
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条目相同的信息)。

于 2010-07-12T18:31:47.690 回答
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 版本)并看看它对您有什么作用。

于 2010-07-12T19:51:00.373 回答
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>)应该可以解决此问题。

于 2012-07-11T02:58:40.290 回答