WCF:更改 ClientCredentials 会产生“此工厂启用了手动寻址,因此必须预先处理所有发送的消息。”

Posted

技术标签:

【中文标题】WCF:更改 ClientCredentials 会产生“此工厂启用了手动寻址,因此必须预先处理所有发送的消息。”【英文标题】:WCF: Changing ClientCredentials produces "Manual addressing is enabled on this factory, so all messages sent must be pre-addressed." 【发布时间】:2011-06-13 04:18:55 【问题描述】:

谁能帮忙,我正在尝试通过通道工厂调用休息服务,但发送我的凭据...休息服务使用 Windows 身份验证。

但使用以下代码,我得到“此工厂启用了手动寻址,因此发送的所有消息都必须预先寻址。”使用 GetMessage 时出错

我知道我的服务就像我删除 Windows 身份验证一样有效!但是在打开 Windows 身份验证且不更改 clientCredentials 的情况下,我收到了 BAD REQUEST,我认为这很正常……所以我需要发送我的客户端凭据

我有点失落。

   ChannelFactory<IService> cf = new ChannelFactory<IService>(new WebHttpBinding(), "http://localhost:8000");


  var defaultCredentials = cf.Endpoint.Behaviors.Find<ClientCredentials>();
  cf.Endpoint.Behaviors.Remove(defaultCredentials); 


  // step two - instantiate your credentials
  ClientCredentials loginCredentials = new ClientCredentials();
  loginCredentials.UserName.UserName = "Test";
  loginCredentials.UserName.Password = "test";


  // step three - set that as new endpoint behavior on factory
  cf.Endpoint.Behaviors.Add(loginCredentials); //add required ones


        IService channel = cf.CreateChannel();

        Console.WriteLine(channel.GetMessage("Dhananjay Get"));

        Console.WriteLine(channel.PostMessage("Dhananjay Post"));

【问题讨论】:

【参考方案1】:

您需要添加一个 webHttp 行为,并将该行为连接到您的端点。最终结果将如下所示:

<system.serviceModel>
  <services>
    <service ...>
       <endpoint behaviorConfiguration="webHttpBehavior" ...>
       </endpoint>
    </service>
  </services>
  <behaviors>
    <endpointBehaviors>
    <behavior name="webHttpBehavior">
      <webHttp/>
    </behavior>
    </endpointBehaviors>
  </behaviors>
  ...
 </system.serviceModel>

如果这没有帮助,请发布您的 web.config。

【讨论】:

【参考方案2】:

虽然这个问题有一个公认的答案,但我想我会添加一些信息。

由于WebServiceFactory 类的GetQueryStringConverter 中的错误(请参阅Microsoft Connect report),如果您通过参数传递对象数组,则不能使用&lt;WebHttp/&gt;。而是将&lt;enableWebScript/&gt; 元素添加到绑定。

客户端 App.Config 或 Web.Config

<behaviors>
  <endpointBehaviors>
    <behavior name="WebHttp_Behaviour">
      <enableWebScript />
    </behavior>
  </endpointBehaviors>
</behaviors>

服务 Web.Config

<behaviors>
  <serviceBehaviors>
    ...
  </serviceBehaviors>
  <endpointBehaviors>
    <behavior name="WebHttp_EndPointBehaviour">
      <enableWebScript />
    </behavior>
  </endpointBehaviors>
</behaviors>

至少,我必须将&lt;enableWebScript\&gt; 添加到客户端和服务器。

【讨论】:

【参考方案3】:

对我来说,我需要将&lt;webHttp/&gt; 添加到客户端的行为中。

【讨论】:

以上是关于WCF:更改 ClientCredentials 会产生“此工厂启用了手动寻址,因此必须预先处理所有发送的消息。”的主要内容,如果未能解决你的问题,请参考以下文章

在 App.config 中设置 WCF ClientCredentials

使用自定义 ClientCredentials 进行 WCF 身份验证:要使用的 clientCredentialType 是啥?

具有消息安全性的 WCF 路由

ASP.NET 网站 + Windows 窗体应用程序 + WCF 服务:客户端凭据

模拟:只调用一次或继续调用每个客户端调用 MVC2 调用 -> WCF

带有 ClientCredentials 流的 OpenIdDict 降级模式