web-dev-qa-db-ja.com

SVCファイルとWCFプロジェクトの関係は?

WCFプロジェクトを作成する場合、既定のメンバーファイルは、svcファイルではなく、通常のcsharpクラスファイルです。 WCFプロジェクトではSVCファイルが必要ですか?いつ使用すべきですか?

30
Craig Schwarze

.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ファイルは必要ありません。

39
Cheeso

.net 4.0以降を使用している場合、次のようにconfigを使用して.svcを「シミュレート」できるようになりました。

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

その後、物理的な.svcファイルもglobal.asaxも必要ありません

19
Sean B

.svcファイルを使用せずに、WCFプロジェクトを作成してIISでホストすることができます。

DataContractをsvcコードビハインドに実装する代わりに、通常の.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;
    }
}

次に、これを可能にするものがあります。次に、Application_Startイベントフックを追加するコードビハインドで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)));
    }
}

これについての1つの素晴らしいことは、リソースURLで.svcを処理する必要がないことです。それほど良くないことの1つは、Global.asaxファイルができたことです。

16
Anton