46

我有一个托管的 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);
}

错误发生在 line return base.Channel.GetData(value);

4

4 回答 4

65

我遇到了这个错误,通过添加 WebHttpBehavior(下面的第 2 行)解决了问题:

var factory = new ChannelFactory<IService>(new WebHttpBinding(), uri);
factory.Endpoint.Behaviors.Add(new WebHttpBehavior());
var proxy = factory.CreateChannel();
于 2010-04-28T14:29:51.423 回答
30

我像往常一样添加了服务引用并收到此错误。结果我所要做的就是修改客户端配置以使用具有指定 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>

于 2011-09-29T08:15:03.443 回答
2

我认为这不一定与您的工厂有关。

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

或其他在“手动寻址”的前几个 Bing 点击中。听起来正在使用的绑定与堆栈/消息传递逻辑的其他部分不兼容。

于 2009-11-25T16:26:08.097 回答
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" />

由于这对我来说是一个相对较新的领域,所以只是解释为什么会出现这些错误,这让我朝着正确的方向前进:)。

于 2009-11-25T23:26:54.523 回答