SVC 文件和 WCF 项目之间的关系?
Posted
技术标签:
【中文标题】SVC 文件和 WCF 项目之间的关系?【英文标题】:Relationship between SVC files and WCF projects? 【发布时间】:2010-01-21 22:31:25 【问题描述】:在创建 WCF 项目时,默认的成员文件只是普通的 csharp 类文件,而不是 svc 文件。 WCF 项目是否需要 svc 文件?什么时候应该使用它们?
【问题讨论】:
【参考方案1】:.svc 文件在 IIS 中托管 WCF 服务时使用。
请参阅 Microsoft 的文档 here 和 here。
IIS 中有一个模块可以处理 .svc 文件。实际上,它是 ASPNET ISAPI 模块,它将对 .svc 文件的请求移交给已为 ASPNET 配置的处理程序工厂类型之一,在这种情况下
System.ServiceModel.Activation.HttpHandler, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
如果您在 IIS 以外的地方托管 WCF 服务,则不需要 .svc 文件。
【讨论】:
我还能在什么地方托管我的服务? 想到的三个是:您编写的自定义主机、您购买的第三方提供的主机或 Windows 服务。 msdn.microsoft.com/en-us/library/bb332338.aspx【参考方案2】:如果您使用的是 .net 4.0 或更高版本,您现在可以通过以下配置“模拟”.svc:
<system.serviceModel>
<!-- bindings, endpoints, behaviors -->
<serviceHostingEnvironment >
<serviceActivations>
<add relativeAddress="MyService.svc" service="MyAssembly.MyService"/>
</serviceActivations>
</serviceHostingEnvironment>
</system.serviceModel>
那么您不需要物理 .svc 文件或 global.asax
【讨论】:
这件事中的.svc 和 global.asax 文件是否可以被视为“已弃用”?【参考方案3】:可以在不使用 .svc 文件的情况下创建 WCF 项目并将其托管在 IIS 中。
您无需在 svc 代码隐藏中实现 DataContract,而是在普通的 .cs 文件中实现它(即没有代码隐藏。)
因此,您将拥有这样的 MyService.cs:
public class MyService: IMyService //IMyService defines the contract
[WebGet(UriTemplate = "resource/externalResourceId")]
public Resource GetResource(string externalResourceId)
int resourceId = 0;
if (!Int32.TryParse(externalResourceId, out resourceId) || externalResourceId == 0) // No ID or 0 provided
WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.NotFound;
return null;
var resource = GetResource(resourceId);
return resource;
然后是使这成为可能的事情。现在您需要创建一个带有代码隐藏的 Global.asax,您可以在其中添加一个 Application_Start 事件挂钩:
public class Global : HttpApplication
void Application_Start(object sender, EventArgs e)
RegisterRoutes();
private void RegisterRoutes()
// Edit the base address of MyService by replacing the "MyService" string below
RouteTable.Routes.Add(new ServiceRoute("MyService", new WebServiceHostFactory(), typeof(MyService)));
这样做的好处是您不必处理资源 URL 中的 .svc。一件不太好的事情是你现在有一个 Global.asax 文件。
【讨论】:
以上是关于SVC 文件和 WCF 项目之间的关系?的主要内容,如果未能解决你的问题,请参考以下文章