使用WCF over HTTP连接到受密码保护的服务器

时间:2011-08-29 19:42:48

标签: wcf web-services http credentials

您好,

我需要使用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将使用的实际网址。

AccessDenied 请注意,这是一个例子,地址和“网站说”是别的。

我要使用的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的帮助!

1 个答案:

答案 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>