#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 является абсолютным, а не относительным, я не вижу проблемы с конфигурацией.