EndpointNotFoundException при вызове операции запуска службы RESTful WCF
У меня действительно странная проблема с одним из моих сервисов WCF. Я уверен, что большинство людей, которые экспериментировали с сервисами WCF, имели EndpointNotFoundException
генерируется, когда конечная точка не была правильно настроена в одном из их файлов конфигурации. От EndpointNotFoundException
страница класса на MSDN:
Исключение, которое выдается, когда удаленная конечная точка не может быть найдена или достигнута.
Далее продолжается:
Конечная точка может быть не найдена или недоступна, поскольку удаленная конечная точка недоступна, удаленная конечная точка недоступна или удаленная сеть недоступна.
Это не отражает мою ситуацию. Таким образом, кажется, что получение EndpointNotFoundException
при работе с WCF нет ничего необычного, но это Exception
не генерируется при первой попытке доступа к службе... вместо этого он генерируется только при попытке вызвать одну из операций службы:
using (ExportConfirmationServiceClient client = new ExportConfirmationServiceClient(
"WebHttpBinding_IExportConfirmationService")) // <-- Exception is NOT thrown here
{
...
component releaseConfirmation = DeserializeTestXmlFile(filePath);
client.AddExportConfirmation("5051275066302", releaseConfirmation);
// Exception is thrown on call to service operation on line above
...
}
Интересно, что Exception
В сообщении также указывается имя операции в указанном пути к файлу:
Там не было конечной точки прослушивания
http://domain/Folder/ServiceName.svc/OperationName
что может принять сообщение. Это часто вызвано неправильным адресом или действием SOAP. Смотрите InnerException, если имеется, для более подробной информации.
Внутренний Exception
имеет следующее сообщение:
Удаленный сервер возвратил ошибку: (404) Not Found.
Это особенно смущает меня, так как я могу успешно перейти к URL-адресу службы и увидеть страницу по умолчанию. Вы создали страницуслужбы:
Кроме того, если я перейду к пути вException
сообщение, я вижу сообщениеEndpoint not found на странице:
Тем не менее, если я перехожу на какую-либо страницу операций одного из моих других работающих сервисов WCF, я получаю стандартный400 Bad Request
ошибка из браузера, хотя операция работает нормально. Так что мне показалось бы, как будто этот оригиналEndpointNotFoundException
может быть красная сельдь... Я действительно не уверен, так как я не тратил много времени на работу с WCF.
Я покажу здесь свой web.config (на стороне сервера) на тот случай, если кому-то понадобится его увидеть:
<?xml version="1.0"?>
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="Midas.WebConfirmations.ExportConfirmationServiceBehaviour">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="webHttp">
<webHttp />
</behavior>
</endpointBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="false" />
<services>
<service name="Midas.WebConfirmations.ExportConfirmationService" behaviorConfiguration="Midas.WebConfirmations.ExportConfirmationServiceBehaviour">
<endpoint address="" binding="webHttpBinding" contract="Midas.WebConfirmations.IExportConfirmationService" behaviorConfiguration="webHttp" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>
</configuration>
Это клиентApp.config
(имейте в виду, что это относится к двум службам WCF):
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IDataService" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="None">
<transport clientCredentialType="None" proxyCredentialType="None" realm="" />
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
</binding>
</basicHttpBinding>
<webHttpBinding>
<binding name="WebHttpBinding_IExportConfirmationService" allowCookies="true" maxReceivedMessageSize="20000000" maxBufferSize="20000000" maxBufferPoolSize="20000000">
<readerQuotas maxDepth="32" maxArrayLength="200000000" maxStringContentLength="200000000"/>
</binding>
</webHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="Midas.WebConfirmations.ExportConfirmationServiceBehaviour">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="webEndpointBehavior">
<webHttp defaultBodyStyle="Wrapped" defaultOutgoingResponseFormat="Xml" helpEnabled="true"/>
</behavior>
</endpointBehaviors>
</behaviors>
<client>
<endpoint address="http://devbucket.ministryofsound.mos.local/MidasWebServices/DataService.svc" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IDataService" contract="Midas.WebServiceClients.IDataService" name="BasicHttpBinding_IDataService" />
<endpoint address="http://devbucket.ministryofsound.mos.local/MidasWebConfirmations/ExportConfirmationService.svc" binding="webHttpBinding" bindingConfiguration="WebHttpBinding_IExportConfirmationService" behaviorConfiguration="webEndpointBehavior" contract="IExportConfirmationService" name="WebHttpBinding_IExportConfirmationService" />
</client>
</system.serviceModel>
</configuration>
Поэтому, если кто-то из великих умов, которые часто переполняют стек, может пролить свет на эту проблему для меня, я был бы очень признателен.
ОБНОВЛЕНИЕ >>>
В ответ на первые несколько комментариев я подозревал, что проблема может быть вызванаException
меня выбросили из кода на стороне сервера, поэтому я резко упростил код операции... теперь все, что он делает, это, но я все еще получаю ту же ошибку:
public void AddExportConfirmation(string upc, component ingestionFeedback)
{
WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.OK;
}
Кроме того, я настроил трассировку, но она работала только на стороне клиента, поэтому она рассказывала только то, что я уже знал. Я посмотрю на предоставленную вами ссылку @BigDaddy, на случай, если она покажет, как настроить трассировку на стороне сервера.
В ответ на Tewr я сгенерировал сервисный клиент, используя svcutil.exe
, но я также попытался добавить ссылку на службу и позволить Visual Studio создать ссылку для меня... оба метода привели к одной и той же ошибке. Кроме того, я обновляю ссылки на сервисы весь день, так как я делаю изменения. includeExceptionDetailInFaults="true"
настройка не имеет никакого значения, но я постараюсь добавить в сервис фиктивную операцию и попробую просмотреть ее в браузере.
ОБНОВЛЕНИЕ 2 >>>
Итак, я добавил простой метод получения в сервис и обновил ссылки, как и предлагал @Tewr. Это только сделало меня более запутанным... метод:
[XmlSerializerFormat()]
[OperationContract]
[WebGet()]
string GetString();
Реализация просто возвращает string
и я вижу это значение при доступе к сервису в веб-браузере:
Тем не менее, я все еще получаю ту же ошибку из кода, даже при вызове этой же новой операции... что это значит?
ОБНОВЛЕНИЕ 3 >>>
Получив совет из комментариев, я снова настроил Service Trace на службе... Я все еще не мог заставить работать на сервере, но на клиенте он вывел файл трассировки. В этом файле я вижу InvalidOperationException
со следующим сообщением:
Версия конверта "EnvelopeNone ( http://schemas.microsoft.com/ws/2005/05/envelope/none)" не поддерживает добавление заголовков сообщений.
Сейчас я просто исследую это, поэтому, если вы знаете, в чем заключается эта ошибка, пожалуйста, дайте мне знать.
1 ответ
Проблема с WCF заключается в том, что Exception
s покрыть так много разных ошибок каждый и Exception
сообщения настолько расплывчаты. Из моего ограниченного опыта, кажется, что сообщение об ошибке скажет одно, но часто оно будет полностью или частично не относиться к вашей реальной проблеме. Поэтому я в основном продолжал исправлять ошибки, которые разблокировали новые Exceptions
(и я до сих пор еще не дошел до их конца!), но для целей этого вопроса, есть ответ.
Итак, оказалось, что оригинал EndpointNotFoundException
был на самом деле брошен, потому что был необработанным Exception
в AddExportConfirmation
внедрение метода обслуживания. Как только я упростил код (как в первом обновлении вопроса), этот конкретный Exception
ушел и был заменен следующим.