您好,
我需要使用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);
}
EDIT2: 这是在Firefox中浏览URL时对话框的样子。我不知道如何检查Proxy.GetMyData将使用的实际网址。
请注意,这是一个例子,地址和“网站说”是别的。
我要使用的Url看起来像这样:
http://bat.myserver.com/ag/get?UID=12345.eu_vddsall_xml&MyId=WRH421&LANG=sv
EDIT3: 通过向web.config添加愚蠢,我们向前迈出了一步(感谢Ladislav Mrnka):
<bindings>
<webHttpBinding>
<binding name="secured">
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Basic" />
</security>
</binding>
</webHttpBinding>
</bindings>
现在我们得到以下异常:
无法使用XmlSerializer以根名称'Binary'和根命名空间''(对于操作'GetMyData'和contract('ICFService','http://tempuri.org/'))反序列化XML主体。确保将与XML对应的类型添加到服务的已知类型集合中。 描述:执行当前Web请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。 异常详细信息:System.Runtime.Serialization.SerializationException:无法使用根名称'Binary'和根命名空间''(对于操作'GetMyData'和contract('ICFService','http://tempuri.org/'))反序列化XML主体XmlSerializer的。确保将与XML对应的类型添加到服务的已知类型集合中。
首先我认为远程服务器maby返回了一个xml文档,显示我在错误的IP上,所以我将网站上传到正确的服务器(使用正确的IP),但我得到了同样的例外吗?
编辑4
创建了一个新问题:Unable to deserialize XML body with root name 'Binary' and root namespace?
感谢Ladislav Mrnka的帮助!
答案 0 :(得分:1)
如果您不知道如何找到它,您应该询问服务提供商如何确保服务安全。
您的网站似乎正在使用基本的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>