Ошибка 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());
    }
}

Я уверен, что мои файлы конфигурации теперь правы, как на клиенте, так и на сервере (можно посмотреть здесь).

ошибка, которую я получаю, похоже, связана с фабрикой:

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

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

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

5 ответов


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

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

Я добавил ссылку на службу, как обычно, и получил эту ошибку. Оказывается, все, что мне нужно было сделать, это изменить конфигурацию клиента, чтобы использовать конфигурацию конечной точки с поведением, указывающим 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>


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

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

  <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" />

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


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

посмотреть

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

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


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