2009-11-25 4 views
40

У меня есть размещенная служба WCF, для которой я создал настраиваемую фабрику, так что это будет работать с несколькими заголовками хостов:Ошибка WCF: на этой фабрике разрешена ручная адресация, поэтому все отправленные сообщения должны быть предварительно адресованы

/// <summary> 
/// Required for hosting where multiple host headers are present 
/// </summary> 
public class MultipleHostServiceFactory : ServiceHostFactory 
{ 
    protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses) 
    { 
     List<Uri> addresses = new List<Uri>(); 
     addresses.Add(baseAddresses[0]); 
     return base.CreateServiceHost(serviceType, addresses.ToArray()); 
    } 
} 

Я уверен, что мои конфигурационные файлы теперь правильные, как на клиенте, так и на сервере (can be seen here).

Ошибки я получаю по-видимому, связана с заводом:

Руководства адресации включено на этой фабрике, поэтому все сообщения, отправленные должны быть предварительно рассмотрены.

public string GetData(int value) { 
    return base.Channel.GetData(value); 
} 

Ошибка возникает по строке return base.Channel.GetData(value);.

ответ

57

я испытал эту ошибку, и проблема была решена путем добавления WebHttpBehavior (строка 2 ниже):

var factory = new ChannelFactory<IService>(new WebHttpBinding(), uri); 
factory.Endpoint.Behaviors.Add(new WebHttpBehavior()); 
var proxy = factory.CreateChannel(); 
+3

Ответы выше не помогли. ваше решение работает. Спасибо. – Matthias

+1

Если конечная точка имеет , то вам нужно использовать WebScriptEnablingBehavior, иначе вы всегда получите «Faulted status». –

+1

Это сработало для меня, но мне также пришлось добавить ссылку на использование для WebHttpBehavior -> 'using System.ServiceModel.Description;' –

1

Я не думаю, что это обязательно имеет какое-либо отношение к вашей фабрике.

См

http://msdn.microsoft.com/en-us/library/system.servicemodel.channels.transportbindingelement.manualaddressing.aspx

или другие среди первых нескольких Bing хиты для "manualaddressing". Похоже, что используемое связывание несовместимо с какой-либо другой частью логики стека/обмена сообщениями.

+0

Ну, я не использую пользовательские ставки - используя веб-webHttpBinding, определенный в обоих. Первоначально проблема заключалась в том, что у клиента была только специальная привязка (я просто сделал ссылку на службу на мой сервер WCF и позволил VS сделать все остальное). Все еще глядя на эту новую ошибку ... – ElHaix

+0

«добавить ссылку на службу» и «webHttpBinding» не работают хорошо и объяснят ошибку. Я думаю, ваш клиент пытается поговорить с SOAP, используя привязку WS-Addressing к вашей службе REST-y, которая просто говорит HTTP. – Brian

+0

См., Например, Http: // damianm.com/tech/building-a-rest-client-with-wcf/ – Brian

2

Так что это, наконец, подошло к концу!

Брайан - благодарю вас за руководство. Переплеты были неправильно выровнены б/т клиента и сервера, и я, наконец, в конечном итоге происходит следующее в обоих:

<basicHttpBinding> 
    <binding name="TransportSecurity"> 
     <security mode="Transport"> 
     <transport clientCredentialType="None"/> 
     </security> 
    </binding> 
    </basicHttpBinding> 

... и установление привязки их конечной точки и bindingConfiguration атрибуты соответственно:

<endpoint binding="basicHttpBinding" 
      bindingConfiguration="TransportSecurity" 
      contract="ServiceReference1.IService" 
      name="WebHttpBinding_IService" 
      address="https://mysslserver.com/Service.svc" /> 

Поскольку это относительно новый дерн для меня, просто объяснение того, почему эти ошибки выскакивают, ведет меня в правильном направлении :).

25

Я добавил ссылку на службу, как обычно, и получил эту ошибку. Оказывается, все, что я должен был сделать, чтобы изменить конфигурацию клиента использовать конечной конфигурации с поведением задав webhttp

<client> 
    <endpoint address="http://localhost:9000/GeoConverterService/GeoConverterService.svc" 
      binding="webHttpBinding" 
      contract="GeoConverter.IGeoConverterService" 
      behaviorConfiguration="webhttp"/> 
</client> 

<behaviors> 
    <endpointBehaviors> 
    <behavior name="webhttp"> 
     <webHttp/> 
    </behavior> 
    </endpointBehaviors> 
</behaviors> 

+2

Hm ... как только я добавлю, что тогда я получаю '(405) Method Not Allowed'. –

0

Да ответ Джейсон Mardell работал для меня, как хорошо, Моя привязанность не указывала на поведение. поэтому в привязке я добавил: behaviorConfiguration="webhttp"