Настройка модели сервиса для WCF

#c# #.net #wcf

#c# #.net #wcf

Вопрос:

У меня есть очень простой веб-сервис, использующий WCF (C #, .NET 4.0) для возврата приветственного сообщения.

Развертывание под IIS 7 и его запуск в порядке, но когда я делаю svcutil.exe http://localhost:4569/Service.svc?wsdl это через CMD для тестирования веб-сервиса, я получаю:

удаленный сервер вернул ошибку: 415 не удается обработать сообщение, поскольку тип содержимого ‘aplication / soap xml charset= utf8’ не соответствует ожидаемому типу ‘text / xml charset = utf8’

При попытке добавить ссылку на службу (для создания клиента) Я получаю

Существующее соединение было принудительно закрыто метаданными удаленного хоста, содержащими ссылку, которая не может быть разрешена: ‘http://localhost:4569/Service.svc «. Тип контента application / soap xml; кодировка = utf-8 не поддерживается службой http://localhost:4569/Service.svc . Привязки клиента и службы могут не совпадать. Удаленный сервер вернул ошибку: (415) Не удается обработать сообщение, поскольку тип содержимого ‘application / soap xml; charset = utf-8’ не был ожидаемым типом ‘text /xml; charset = utf-8’..

Я почти уверен, что проблема находится в моем файле Web.config:

     <configuration>
      <system.web>
        <compilation debug="true" targetFramework="4.0" />
      </system.web>
      <system.serviceModel>
<services>
         <service name="Service">
             <endpoint name="soap" 
                 address="http://localhost:4569/Service.svc" 
                 binding="basicHttpBinding" 
                 contract="IService" />
             <endpoint name="mex" address="mex" binding="mexHttpBinding" 
                       contract="IMetadataExchange" />
         </service>
         <behaviors>
            <serviceBehaviors>
               <behavior>
                  <serviceMetadata httpGetEnabled="true"/>
                  <serviceDebug includeExceptionDetailInFaults="false"/>
               </behavior>
            </serviceBehaviors>
</services>
         </behaviors>
         <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
      </system.serviceModel>
      <system.webServer>
        <modules runAllManagedModulesForAllRequests="true"/>
      </system.webServer>
    </configuration>
  

В любом случае, вот мой код:

IService.cs:

 [ServiceContract]
public interface IService
{
    [OperationContract]
    string getMessage();
}
  

В моем service.cs есть метод

 public class Service : IService
{
    public string getMessage()
    {
        return "Ola servico";
    }
}
  

Я действительно не знаю, что происходит, провел несколько тестов после некоторых исследований, но безуспешно.

Service.svc

 <%@ ServiceHost Language="C#" Debug="true" Service="Service" CodeBehind="~/App_Code/Service.cs" %>        
  

Комментарии:

1. Вы не показываете нам интересные важные ) части вашей конфигурации! <services> Раздел <system.serviceModel> на стороне сервера и содержимое файла * .svc! Пожалуйста, добавьте их — в противном случае нам остается только гадать….

2. это весь конфигурационный файл? определены ли службы, привязки и конечные точки в коде?

3. Сообщение об ошибке будет указывать на то, что вы смешиваете SOAP и REST. Кажется, вы хотите получить WSDL, но может показаться, что вы используете привязку REST ( webHttpBinding ) ….

4. @marc_s Я пробовал, отредактировал вопрос, но не работает..

5. когда вы говорите «запуск в порядке», вы имеете в виду в браузере и пытались ли вы подключиться к нему через wcftestclient? кроме того, и это может быть глупым вопросом, но реализует ли ваш GetMessage() контракт на обслуживание?

Ответ №1:

В вашей конфигурации нет службы и конечной точки. Попробуйте добавить

 <services>
  <service name="Service"> <!-- name should match the name in your .svc file (if you open it with a text editor) -->
    <endpoint name="soap" address="" binding="basicHttpBinding" contract="IService" />
    <endpoint name="mex" address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
  </service>
</services>
  

Комментарии:

1. Я пробовал DonAndre, но он не работает. В любом случае отредактировал мой вопрос в разделе services,

2. Конфигурация не работает так, как вы ее опубликовали. Службы должны быть закрыты перед поведением. Адрес вашей конечной точки soap должен быть пустой строкой, потому что это относится к тому, что идет после .svc в URL.

3. @Я знаю, код даже не компилируется таким образом, это была ошибка, но в моем коде все правильно.

4. @Tiago Я видел, что вы также включили «runAllManagedModulesForAllRequests», попробуйте отключить его и посмотрите снова. Возможно, ошибка исходит от одного из модулей. Также, пожалуйста, обновите web.config в вашем вопросе версией, используемой IIS. Помимо того, что адрес вашей конечной точки soap является абсолютным, а не относительным, я не вижу проблемы с конфигурацией.