2010-06-15 2 views
5

Исключение «Эта операция не поддерживается для относительного URI.» Происходит в следующей ситуации:Странное исключение при подключении к службе WCF через прокси-сервер

У меня есть службы WCF:

[ServiceContract(ProtectionLevel=ProtectionLevel.None)] 
public interface IMyService 
{ 
    [OperationContract] 
    [FaultContract(typeof(MyFault))] 
    List<MyDto> MyOperation(int param); 

    // other operations 
} 

public class MyService : IMyService 
{ 
    public List<MyDto> MyOperation(int param) 
    { 
     // Do the business stuff and return a list of MyDto 
    } 

    // other implementations 
} 

MyFault и MyDto две очень простые классы, отмеченные атрибутом [DataContract] и каждый только имея три [DataMember] типа string, int and int?.

Эта служба размещена в IIS 7.0 на сервере Win 2008 Server вместе с приложением ASP.NET. Я использую SVC-файл MyService.svc, который находится непосредственно в корневом каталоге веб-сайта. Конфигурация службы в web.config является следующее:

<system.serviceModel> 
    <services> 
    <service name="MyServiceLib.MyService"> 
     <endpoint address="" binding="wsHttpBinding" 
      bindingConfiguration="wsHttpBindingConfig" 
      contract="MyServiceLib.IMyService" /> 
    </service> 
    </services> 
    <bindings> 
    <wsHttpBinding> 
     <binding name="wsHttpBindingConfig"> 
     <security mode="None"> 
      <transport clientCredentialType="None" /> 
     </security> 
     </binding> 
    </wsHttpBinding> 
    </bindings> 
    <behaviors> 
    <serviceBehaviors> 
     <behavior> 
     <serviceMetadata httpGetEnabled="false"/> 
     <serviceDebug includeExceptionDetailInFaults="false" /> 
     </behavior> 
    </serviceBehaviors> 
    </behaviors> 
</system.serviceModel> 

Это, кажется, работает до сих пор, как я могу ввести адрес http://www.domain.com/MyService.svc в браузере и получить «Это Windows Communication Foundation Service» Приветственная страница.

Один из клиентов, потребляющих услуги является консольным приложением:

MyServiceClient aChannel = new MyServiceClient("WSHttpBinding_IMyService"); 
List<MyDto> aMyDtoList = aChannel.MyOperation(1); 

Он имеет следующую конфигурацию:

<system.serviceModel> 
    <bindings> 
    <wsHttpBinding> 
     <binding name="WSHttpBinding_IMyService" closeTimeout="00:01:00" 
      openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
      bypassProxyOnLocal="true" transactionFlow="false" 
      hostNameComparisonMode="StrongWildcard" 
      maxBufferPoolSize="524288" maxReceivedMessageSize="65536" 
      messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="false" 
      proxyAddress="10.20.30.40:8080" allowCookies="false"> 
      <readerQuotas maxDepth="32" maxStringContentLength="8192" 
       maxArrayLength="16384" 
       maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
      <reliableSession ordered="true" inactivityTimeout="00:10:00" 
       enabled="false" /> 
      <security mode="None"> 
      <transport clientCredentialType="Windows" proxyCredentialType="None" 
       realm="" /> 
      <message clientCredentialType="Windows" 
       negotiateServiceCredential="true" /> 
      </security> 
     </binding> 
     </wsHttpBinding> 
    </bindings> 
    <client> 
     <endpoint address="http://www.domain.com/MyService.svc" binding="wsHttpBinding" 
      bindingConfiguration="WSHttpBinding_IMyService" 
      contract="MyService.IMyService" 
      name="WSHttpBinding_IMyService" /> 
    </client> 
</system.serviceModel> 

Когда я запустить это приложение на производственном сервере на объекте заказчика вызова aChannel.MyOperation(1) выдает следующее исключение:

Эта операция не поддерживается для относительного URI.

При запуске этого клиентского приложения на моем компьютере развития с точно такой же конфигурацией, с тем исключением, что я удалить proxyAddress="10.20.30.40:8080" из привязок операция работает без проблем.

Теперь я действительно не знаю , что указывает адрес прокси-сервера, возможно, имеет отношение к абсолютным или относительным URI. Использование прокси-сервера или нет - единственное различие, которое я могу видеть при запуске клиента на производстве или на машине разработки.

Есть ли у кого-то идеи, что это исключение может означать в этом контексте и как, возможно, решить проблему?

Заранее благодарю за помощь!

Edit:

В случае это должно быть важно: Обслуживание и клиента строятся с WCF в .NET Framework 4.

ответ

8

10.20.30.40:8080 недействительный URL. Вы хотите http://10.20.30.40:8080.


Вот мой диагностический процесс мышления, в случае, если это поможет кому:

  1. Исключения обычно не лежат. Они обычно означают именно то, что они говорят. Трюк заключается в том, чтобы понять, как они могут говорить правду.
  2. Исключение указано: «Эта операция не поддерживается для относительного URI». Если это так, то это означает, что операция выполняется, ей присваивается относительный URL-адрес, но он не поддерживает относительные URI.
  3. OP тогда сказал, что когда он запускает приложение «за исключением того, что я удаляю proxyAddress =« 10.20.30.40:8080 »из привязок».

Там передо мной был относительный URI. Когда он удалил его, «операция» работала, поэтому я понял, что это относительный URI, который был предоставлен «операции», которая их не поддерживает.

Вам не обязательно быть Шерлоком Холмсом, чтобы решить эту проблему. Ключ был в состоянии мгновенно увидеть, что перед URI не было scheme://, что делает его относительным.

+0

Ничего себе! Вопрос длиной в тысячу страниц, одна строка ответа, и вы попали в гвоздь. Просто протестирован, работает, отмечен как ответ. Я скрываю от стыда. Во всяком случае: Хорошо, что я спросил. Большое спасибо! (Edit: Lol, «вы можете принять ответ за 2 минуты», вы были слишком быстры. Ожидание сейчас 2 минуты ...) – Slauma

+1

Slauma, это очень хорошо, что вы спросили!)) Потому что я попался в очень похожую ситуацию. Причина, по которой URL-адрес прокси использовался без «http: //», в моем случае заключается в том, что он был скопирован из другого места (параметр в wget.exe), где он был законным синтаксисом. – Ivan

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

  • Нет связанных вопросов^_^