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),如果您通过参数传递对象数组,则不能使用<WebHttp/>
。而是将<enableWebScript/>
元素添加到绑定。
客户端 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>
至少,我必须将<enableWebScript\>
添加到客户端和服务器。
【讨论】:
【参考方案3】:对我来说,我需要将<webHttp/>
添加到客户端的行为中。
【讨论】:
以上是关于WCF:更改 ClientCredentials 会产生“此工厂启用了手动寻址,因此必须预先处理所有发送的消息。”的主要内容,如果未能解决你的问题,请参考以下文章
在 App.config 中设置 WCF ClientCredentials
使用自定义 ClientCredentials 进行 WCF 身份验证:要使用的 clientCredentialType 是啥?
ASP.NET 网站 + Windows 窗体应用程序 + WCF 服务:客户端凭据