我有一个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>
答案 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>
的开头标记之后)应解决此问题。