Служба WCF на основе MessageContract в приложении MVC не будет обслуживать метаданные - PullRequest
1 голос
/ 15 июня 2011

Я перечитал все вопросы о 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
            );
        }

1 Ответ

1 голос
/ 17 июня 2011

Вы размещаете сервис через WebServiceHostFactory, это означает, что вы создаете конечную точку REST.

Цель MessageContract - определить сообщение SOAP (заголовки и тело), ​​поэтому они не поддерживаются для сервисов, созданных с помощью WebServiceHostFactory

Вы имели в виду использование конечной точки SOAP, а не REST?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...