gpt4 book ai didi

wcf - 通过 HTTP 使用 WCF 连接到受密码保护的服务器

转载 作者:可可西里 更新时间:2023-11-01 16:39:19 25 4
gpt4 key购买 nike

你好,

我需要使用 WCF 将我的 ASP.NET MVC 应用程序连接到网络上的服务器。服务器受用户名和密码保护,但它似乎不是 https,而是简单的 http。

这是我目前的代码:

public MyObject GetMyData(string id)
{
ChannelFactory<MyIService> factory;
ClientCredentials loginCredentials = new ClientCredentials();

loginCredentials.UserName.UserName = "MyName";
loginCredentials.UserName.Password = "MyPassword";

factory = new ChannelFactory<ICFService>("MyData");

var defaultCredentials = factory.Endpoint.Behaviors.Find<ClientCredentials>();
factory.Endpoint.Behaviors.Remove(defaultCredentials); //remove default ones
factory.Endpoint.Behaviors.Add(loginCredentials); //add required ones

var proxy = factory.CreateChannel();
var response = proxy.GetMyData(id);
((IDisposable)proxy).Dispose();

return response as MyObject ;
}

这放在我的 web.config 中

  <system.serviceModel>
<client>
<endpoint address="http://MyUrl/"
binding="webHttpBinding"
behaviorConfiguration="MyData"
contract="MyNameSpace.MyIService"
name="MyData"/>
</client>
<behaviors>
<endpointBehaviors>
<behavior name="MyData">
<webHttp/>
</behavior>
</endpointBehaviors>
</behaviors>

</system.serviceModel>

问题是我得到以下异常:

远程服务器返回错误:(401) 未经授权。说明:在执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其在代码中的来源的更多信息。异常详细信息:System.Net.WebException:远程服务器返回错误:(401) 未经授权。

我知道我尝试与之通信的服务器只有在我的应用程序位于特定 IP nr 上时才会通信,但这已经完成并且应该可以工作。

请指教

编辑1:

这是服务的样子:

[ServiceContract]
[XmlSerializerFormat]
public interface ICFService
{
[OperationContract]
[WebGet(BodyStyle = WebMessageBodyStyle.Bare,
ResponseFormat = WebMessageFormat.Xml,
UriTemplate = "get?UID=12345.eu_vddsall_xml&MyId={MyId}&LANG=en")]
CFExtendedDescription GetMyData(string MyId);

}

编辑2:这是在 firefox 中浏览 url 时对话框的样子。我不确定如何检查 Proxy.GetMyData 将使用的实际 url。

AccessDenied请注意,这是一个示例,地址和“网站说”是另外一回事。

我应该使用的 Url 如下所示:

http://bat.myserver.com/ag/get?UID=12345.eu_vddsall_xml&MyId=WRH421&LANG=sv

编辑 3:通过将 foolowing 添加到 web.config,我们向前迈进了一步(感谢 Ladislav Mrnka):

<bindings>
<webHttpBinding>
<binding name="secured">
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Basic" />
</security>
</binding>
</webHttpBinding>
</bindings>

现在我们得到以下异常:

无法使用 XmlSerializer 反序列化具有根名称“Binary”和根命名空间“”的 XML 正文(对于操作“GetMyData”和协定(“ICFService”、“http://tempuri.org/”))。确保将与 XML 对应的类型添加到服务的已知类型集合中。说明:在执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其在代码中的来源的更多信息。异常详细信息:System.Runtime.Serialization.SerializationException:无法使用 XmlSerializer 反序列化具有根名称“Binary”和根命名空间“”的 XML 正文(对于操作“GetMyData”和协定(“ICFService”、“http://tempuri.org/”))。确保将 XML 对应的类型添加到服务的已知类型集合中。

首先我认为远程服务器 maby 返回了一个 xml 文档,显示我在错误的 IP 上,所以我将网站上传到正确的服务器(使用正确的 ip)但我在那里遇到了同样的异常?

编辑4

创建了一个新问题:Unable to deserialize XML body with root name 'Binary' and root namespace?

感谢 Ladislav Mrnka 的帮助!

最佳答案

如果您不知道如何找到它,您应该询问服务提供商如何保证服务安全。

看起来您的站点正在使用基本的 HTTP 身份验证。对于此类身份验证,您需要创建自定义 webHttpBinding 配置:

<system.serviceModel>
<client>
<endpoint address="http://MyUrl/"
binding="webHttpBinding"
bindingConfiguration="secured"
behaviorConfiguration="MyData"
contract="MyNameSpace.MyIService"
name="MyData"/>
</client>
<bindings>
<webHttpBinding>
<binding name="secured">
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Basic" />
</security>
</binding>
</webHttpBinding>
</bindings>
<behaviors>
<endpointBehaviors>
<behavior name="MyData">
<webHttp/>
</behavior>
</endpointBehaviors>
</behaviors>
</system.serviceModel>

关于wcf - 通过 HTTP 使用 WCF 连接到受密码保护的服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7235047/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com