Я перечитал все вопросы о SO, которые я мог найти при размещении службы WCF в приложении MVC, и, к сожалению, я не нашел много информации о службах, которые указывают MessageContract
s.Мне нужно выполнить потоковую передачу файлов, поэтому, если я хочу принять метаданные о потоке, я должен указать заголовки в контракте сообщения.
Я добавил этот сервис в свое приложение MVC и добавил ServiceRoute
;браузер не может получить WSDL, как ожидалось, а Visual Studio не может получить метаданные службы, необходимые для генерации прокси-классов клиента.Оба получают ошибку, подобную следующей:
Operation 'ImportMessageBody' in contract 'IImport' uses a MessageContract that has
SOAP headers. SOAP headers are not supported by the None MessageVersion.
Связанная трассировка стека:
[InvalidOperationException: Operation 'ImportMessageBody' in contract 'IImport' uses a MessageContract that has SOAP headers. SOAP headers are not supported by the None MessageVersion.]
System.ServiceModel.Description.WebHttpBehavior.ValidateNoMessageContractHeaders(MessageDescription md, String opName, String contractName) +704271
System.ServiceModel.Description.WebHttpBehavior.ValidateContract(ServiceEndpoint endpoint) +134
System.ServiceModel.Description.WebHttpBehavior.Validate(ServiceEndpoint endpoint) +51
System.ServiceModel.Description.ServiceEndpoint.Validate(Boolean runOperationValidators, Boolean isForService) +287
System.ServiceModel.Description.DispatcherBuilder.ValidateDescription(ServiceDescription description, ServiceHostBase serviceHost) +271
System.ServiceModel.Description.DispatcherBuilder.InitializeServiceHost(ServiceDescription description, ServiceHostBase serviceHost) +109
System.ServiceModel.ServiceHostBase.InitializeRuntime() +60
System.ServiceModel.ServiceHostBase.OnBeginOpen() +27
System.ServiceModel.ServiceHostBase.OnOpen(TimeSpan timeout) +50
System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) +318
System.ServiceModel.Channels.CommunicationObject.Open() +36
System.ServiceModel.HostingManager.ActivateService(String normalizedVirtualPath) +184
System.ServiceModel.HostingManager.EnsureServiceAvailable(String normalizedVirtualPath) +615
[ServiceActivationException: The service '/a/import' cannot be activated due to an exception during compilation. The exception message is: Operation 'ImportMessageBody' in contract 'IImport' uses a MessageContract that has SOAP headers. SOAP headers are not supported by the None MessageVersion..]
System.Runtime.AsyncResult.End(IAsyncResult result) +679246
System.ServiceModel.Activation.HostedHttpRequestAsyncResult.End(IAsyncResult result) +190
System.ServiceModel.Activation.AspNetRouteServiceHttpHandler.EndProcessRequest(IAsyncResult result) +6
System.Web.CallHandlerExecutionStep.OnAsyncHandlerCompletion(IAsyncResult ar) +96
WcfTestClient также имеет ту же проблему (как и следовало ожидать).
Что мне нужно сделать, чтобы включить генерацию прокси-клиента?
Вот раздел serviceModel файла web.config для моего приложения MVC:
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" />
</system.serviceModel>
ИМаршрут, который я добавил:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.IgnoreRoute("{resource}.svc/{*pathInfo}");
routes.IgnoreRoute("favicon.ico");
routes.Add(new ServiceRoute("a/import", new WebServiceHostFactory(), typeof(Services.Import.Import)));
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
}