2010-01-21 6 views

ответ

32

.svc-файлы используются, когда вы размещаете свою службу WCF в IIS.

См. Документ Microsoft here и here.

В IIS есть модуль, который обрабатывает файл .svc. На самом деле, это ISAPI модуль ASPNET, который руки прочь запрос на SVC-файла к одному из типов обработчика фабричных, который был сконфигурирован для ASPNET, в этом случае

System.ServiceModel.Activation.HttpHandler, System.ServiceModel, Version = 3.0.0.0, культура = нейтральной, PublicKeyToken = b77a5c561934e089


Если вы хостинг вашей службы WCF в чем-то другом, чем IIS, то вам не нужен SVC-файл.

+0

Что еще я могу разместить в своей службе? –

+3

Три, которые приходят на ум, это: пользовательский хост, который вы пишете, сторонний поставщик, который вы покупаете, или служба Windows. http://msdn.microsoft.com/en-us/library/bb332338.aspx – Cheeso

15

Вид старых вопросов, но для Googlers ..

На самом деле, можно создать проект WCF и разместить его в IIS без использования SVC-файла.

Вместо реализации вашего 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; 
    } 
} 

Затем приходит вещь, делающая это возможным. Теперь вам нужно создать 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))); 
    } 
} 

Одна хорошая вещь о том, что вы не должны обрабатывать .svc в ваших URL-адресов ресурсов. Не так приятно, что теперь у вас есть файл Global.asax.

18

Если вы используете .NET 4.0 или более поздней версии, теперь вы можете «моделировать» в .svc с помощью конфигурации со следующим:

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

Тогда вам не нужен физический файл SVC-ни глобальной .asax

+1

Могут ли файлы .svc и global.asax в этом вопросе считаться «устаревшими»? –

Смежные вопросы