tutorial - wcf wiki




Beziehung zwischen SVC-Dateien und WCF-Projekten? (2)

.svc-Dateien werden verwendet, wenn Sie Ihren WCF-Dienst in IIS hosten.

Siehe Microsoft-Dokument here und here .

Es gibt ein Modul in IIS, das die .svc-Datei verarbeitet. Tatsächlich ist es das ASPNET ISAPI-Modul, das in diesem Fall die Anforderung für die .svc-Datei an einen der Handler-Factory-Typen übergibt, der für ASPNET konfiguriert wurde

System.ServiceModel.Activation.HttpHandler, System.ServiceModel, Version = 3.0.0.0, Kultur = neutral, PublicKeyToken = b77a5c561934e089

Wenn Sie Ihren WCF-Dienst in etwas anderem als IIS hosten, benötigen Sie die .svc-Datei nicht.

Beim Erstellen eines WCF-Projekts handelt es sich bei den Standardmemberdateien um normale csharp-Klassendateien anstelle von SVC-Dateien. Sind bei einem WCF-Projekt SVC-Dateien erforderlich? Wann sollten sie verwendet werden?


Eine Art alte Fragen, aber für Google-Mitarbeiter.

Tatsächlich ist es möglich, ein WCF-Projekt zu erstellen und es in IIS zu hosten, ohne eine .svc-Datei zu verwenden.

Anstatt Ihren DataContract in Ihrem SVC-Code-Behind zu implementieren, implementieren Sie ihn in einer normalen .cs-Datei (dh kein Code dahinter.)

Also, Sie hätten eine MyService.cs wie folgt:

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;
    }
}

Dann kommt die Sache, die das ermöglicht. Jetzt müssen Sie ein Global.asax mit Code-Behind erstellen, in dem Sie einen Application_Start-Ereignis-Hook hinzufügen:

 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)));
    }
}

Eine nette Sache dabei ist, dass Sie die .svc in Ihren Ressourcen-URLs nicht behandeln müssen. Eine nicht so nette Sache ist, dass Sie jetzt eine Global.asax-Datei haben.





wcf