C# SVC文件和WCF项目之间的关系?

C# SVC文件和WCF项目之间的关系?,c#,wcf,iis,C#,Wcf,Iis,创建WCF项目时,默认成员文件只是普通的csharp类文件,而不是svc文件。WCF项目是否需要svc文件?什么时候应该使用它们?.svc文件是在IIS中托管WCF服务时使用的 请参阅Microsoft的文档和 IIS中有一个模块处理.svc文件。实际上,它是ASPNET ISAPI模块,在本例中,它将.svc文件的请求转交给为ASPNET配置的处理程序工厂类型之一 System.ServiceModel.Activation.HttpHandler,System.ServiceModel,版本

创建WCF项目时,默认成员文件只是普通的csharp类文件,而不是svc文件。WCF项目是否需要svc文件?什么时候应该使用它们?

.svc文件是在IIS中托管WCF服务时使用的

请参阅Microsoft的文档和

IIS中有一个模块处理.svc文件。实际上,它是ASPNET ISAPI模块,在本例中,它将.svc文件的请求转交给为ASPNET配置的处理程序工厂类型之一

System.ServiceModel.Activation.HttpHandler,System.ServiceModel,版本=3.0.0.0,区域性=中性,PublicKeyToken=b77a5c561934e089



如果您在IIS以外的其他地方托管WCF服务,则不需要.svc文件

可以创建WCF项目并将其托管在IIS中,而无需使用.svc文件

不是在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,并在其中添加一个应用程序启动事件挂钩:

 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文件。

如果您使用的是.net 4.0或更高版本,您现在可以通过以下配置“模拟”.svc:

<system.serviceModel>
   <!-- bindings, endpoints, behaviors -->
   <serviceHostingEnvironment >
      <serviceActivations>
         <add relativeAddress="MyService.svc" service="MyAssembly.MyService"/>
      </serviceActivations>
   </serviceHostingEnvironment>
</system.serviceModel>


那么,您不需要物理.svc文件,也不需要全局.asax

还有什么可以承载我的服务?我想到的三个是:您编写的自定义主机、您购买的第三方提供的主机或Windows服务。在这种情况下,是否可以将.svc和global.asax文件视为“已弃用”?