При создании проекта WCF файлы-члены по умолчанию являются обычными файлами класса csharp, а не svc файлами. Требуются ли файлы svc с проектом WCF? Когда они должны использоваться?
Связь между SVC файлами и проектами WCF?
Ответ 1
.svc файлы используются, когда вы размещаете свою службу WCF в IIS.
См. документ Microsoft здесь и здесь.
Внутри IIS есть модуль, который обрабатывает файл .svc. На самом деле это ASPNET ISAPI Module, который отдает запрос на файл .svc одному из типов обработчиков factory, которые были настроены для ASPNET, в этом случае
System.ServiceModel.Activation.HttpHandler, System.ServiceModel, Version = 3.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089
Если вы размещаете свою службу WCF в чем-то, отличном от IIS, вам не нужен файл .svc.
Ответ 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
Ответ 3
Можно создать проект 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.