.NET Compact Framework,WCF服务,压缩和DIGEST身份验证

时间:2011-06-15 08:52:47

标签: c# wcf compact-framework windows-ce

我正在尝试将许多功能放在一起,由于.NET Compact Framework的限制,这一功能越来越难。

具体来说,我有一个WCF服务,我正在为它编写一个移动设备客户端。抓到了吗?我想使用某种数据压缩(由于连接到所述设备的调制解调器非常慢)和HTTP DIGEST身份验证(已经在托管WCF服务的站点上实现)。

我已按照this blog entry获取WCF服务客户端所需的压缩和生成代码。

然而,我正在努力使用HTTP DIGEST。我不知道如何添加此功能。

以前我没有使用压缩,因此我使用SOAP连接到WCF服务,使用简单的WebService引用,并添加HTTP DIGEST我必须覆盖GetWebRequest方法并手动添加所需的头。这次生成的类似乎给了很少的回旋余地,我没有太多可以覆盖。此外,所有安全或身份验证参数似乎都是针对SSL设计的,而不是基于这种基本身份验证方案。

总结一下:如何使用.NET Compact Framework使用压缩和HTTP DIGEST身份验证创建WCF客户端?

编辑: 这是我目前得到的代码:

        System.ServiceModel.Channels.CustomBinding customBinding = new System.ServiceModel.Channels.CustomBinding();
        CompressionMessageEncodingBindingElement compressionBindingElement = new CompressionMessageEncodingBindingElement();
        customBinding.Elements.Add(compressionBindingElement);
        HttpTransportBindingElement httpBindingElement = new HttpTransportBindingElement();
        customBinding.Elements.Add(httpBindingElement);
        EndpointAddress endPoint = new EndpointAddress("http://localhost:5100/Service.svc");
        ServiceClient client = new ServiceClient(customBinding, endPoint);

我怀疑我需要将HTTP DIGEST功能添加到CustomBinding类,但我不知道如何。

我怀疑我还应该注意,当我使用.NET Compact Framework 3.5时,我正在创建一个Windows CE应用程序。因此,我没有打扰下载Windows Mobile 6 SDK。如果这些SDK添加了更多可以在Window CE应用程序中使用的功能,并且是HTTP DIGEST工作所必需的,请告诉我。

3 个答案:

答案 0 :(得分:1)

我们最终禁用了运行.NET CF的设备的DIGEST身份验证。它不那么安全,但我们认为在我们的情况下运行.NET CF的设备发送和检索的数据不是那么敏感,所以我们真正需要做的就是验证它。

答案 1 :(得分:0)

如果客户端在.NET Compact Framework 3.5上运行,则可以使用WCF调用服务并使用内置的HTTP摘要式身份验证支持,而无需SSL。

以下是如何以编程方式配置WCF客户端以使用BasicHttpBinding的摘要式身份验证:

var binding = new BasicHttpBinding();
binding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Digest;
var endpoint = new EndpointAddress("http://server/myservice");
var client = new MyServiceClient(binding, endpoint);

// We have to set the actual credentials on the client proxy object
// before invoking the service:
client.ClientCredentials.HttpDigest.ClientCredential.UserName = "me";
client.ClientCredentials.HttpDigest.ClientCredential.Password = "password";

try
{
    client.MyServiceOperation();
    client.Close();
}
catch
{
    client.Abort();
}

相关资源:

答案 2 :(得分:0)

实现此目的的唯一方法是使用HttpWebRequest(手动)并指定ClientCredentials,而不是NetCFSvcUtil生成的不支持身份验证的类。 它在CF上使用WCF支持的唯一WS-Security规范是通过相互证书交换有效地使用消息安全性。 (顺便提一下,我和大家发现了一个内存泄漏:http://connect.microsoft.com/VisualStudio/feedback/details/727247/native-memory-leak-in-wcf-proxy-client-with-mutual-certificate-security-in-net-compact-framework-3-5-on-windows-ce-6-0

值得注意的是,生成的CFClientBase也有内存泄漏,可以解决,请参阅:http://geekswithblogs.net/GruffCode/archive/2013/03/31/memory-leak-in-cfclientbaselttgt-service-proxy-for-compact-framework-.net.aspx

供参考:NetCF支持的WCF子集:http://blogs.msdn.com/b/andrewarnottms/archive/2007/08/21/the-wcf-subset-supported-by-netcf.aspx