2009-08-13 5 views
4

У меня есть довольно большой webapp, который строится в MVC. Я также абстрагирую общий код в структуру, которая находится в отдельном проекте. Надеемся, что эти рамки будут использованы в других проектах в ближайшем будущем. Есть несколько приложений Silverlight, которые являются частью этой структуры, и одним из их заданий является загрузка файлов на кусок за раз. Чтобы добиться этого, я хочу, чтобы они общались с сервисом WCF, который также живет в рамках проекта. У меня проблемы с этим.Хостинг службы WCF в приложении ASP.NET MVC?

Я скопировал данные app.config VS2008, добавленные в мой проект framework для службы в web.config, но это, похоже, не работает.

После недолгих поисков я обнаружил, что вы можете написать службу с кодом позади, путем создания SVC-файла и соответствующий файл .cs, поэтому я попытался создать MyService.svc так:

<% @ServiceHost language="C#" 
Service="MyFramework.MyService" 
%> 

Поскольку моя служба существует в рамках другого проекта, для ссылки на файл отсутствует ссылка, поэтому я предположил, что там будет достаточно ссылки на Namespace.Class.

Я также добавил MyService.svc/{* pathInfo} к игнорированным маршрутам в моем файле Global.asax.

Однако, когда я пытаюсь найти localhost: x/MyService.svc, или когда я пытаюсь найти сервис с помощью инструмента «Добавить сервис» в VS2008, он просто кажется зависающим.

Что я делаю неправильно?

Энтони

ответ

10

Да ну ваша служба WCF основана SOAP - вы не сможете просто просматривать его и увидеть что-нибудь.

Если вы хотите, чтобы увидеть описание сервиса и все, вам нужно включить «метаданные» обмен на

  • указав <serviceMetadata> поведения в вашей конфигурации службы
  • , определяющей «Mex» (обмен метаданными) конечная точка в вашей конфигурации службы

Чтобы позволить serviceMetadata, вам нужен этот раздел в вашей конфигурации службы (web.config - раздел <system.serviceModel>):

<system.serviceModel> 
    <behaviors> 
    <serviceBehaviors> 
     <behavior name="MEXServiceBehavior"> 
       <serviceMetadata httpGetEnabled="True"/> 
      </behavior> 
     </serviceBehaviors> 
    </behaviors> 

и вам нужно ссылаться, что от службы:

<system.serviceModel> 
    <service name="....." behaviorConfiguration="MEXServiceBehavior" ....> 

Чтобы определить конечную точку MEX, использовать что-то вроде этого:

<services> 
    <service name="....." behaviorConfiguration="MEXServiceBehavior" ....> 
     <endpoint address="http://localhost:5555/YourSerice/mex" 
        binding="mexHttpBinding" contract="IMetadataExchange" /> 

Там должно быть много доступной документации чтобы показать вам, как это сделать (в том числе множество вопросов и ответов на этот вопрос в Stackoverflow).

Просто крошечный nitpick: вы не размещаете свою услугу «в ASP.NET MVC» - вы размещаете ее в IIS - веб-сервере MS. Это абсолютно не зависит от того, используете ли вы ASP.NET MVC, веб-формы ASP.NET или что-то еще, если на то пошло.

Marc

+0

«Да ну ваша служба WCF является SOAP на основе - вы не сможете просто просматривать его и увидеть что-нибудь.» Это определенно не так. Вы можете создать методы WCF для возврата HTML, который будет отображаться браузером. Поиск

+0

@ ZachSmith: когда вы используете '', тогда у вас есть ** услуга REST **, а не ** SOAP ** сервис - и * да * - вы можете« просто просматривать »на * * Служба REST ** - я знаю, что это не то, о чем я говорил, вы ** не можете просто просматривать ** в любой сервис ** SOAP ** (что-либо *, но * связывание webHttp ......) –

+0

ах. я вижу - извините. Почему вы скажете, что создает услугу REST в частности? Хотя я знаю, что он делает контент доступным по запросу браузера, я не уверен, –

2

Что относительно вас web.config? есть вы добавили такие вещи

<system.serviceModel> 
<behaviors> 
    <serviceBehaviors> 
    <behavior name="MyFramework.MyServiceBehavior"> 
     <serviceMetadata httpGetEnabled="true" /> 
     <serviceDebug includeExceptionDetailInFaults="true" /> 
     <serviceThrottling 
      maxConcurrentCalls="200" 
      maxConcurrentSessions="100" 
      maxConcurrentInstances="100" /> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 
<services> 
    <service 
     behaviorConfiguration="MyFramework.MyServiceBehavior" 
     name="MyFramework.MyService"> 
    <endpoint binding="wsHttpBinding"    
       bindingConfiguration="MyServiceBindingSettings" 
       contract="MyFramework.IMyService"> 
     <identity> 
     <dns value="localhost" /> 
     </identity> 
    </endpoint> 
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
    </service> 
</services> 
<bindings> 
    <wsHttpBinding> 
    <binding name="MyServiceBindingSettings" 
      closeTimeout="00:10:00" openTimeout="00:10:00" sendTimeout="00:10:00" 
      maxReceivedMessageSize="2147483647" maxBufferPoolSize="2147483647" 
      messageEncoding="Text" textEncoding="utf-8"> 
     <readerQuotas 
      maxDepth="2147483647" 
      maxStringContentLength="2147483647" 
      maxArrayLength="2147483647" maxBytesPerRead="2147483647" 
      maxNameTableCharCount="2147483647"/> 
    </binding> 
    </wsHttpBinding> 
</bindings> 

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