C# .NET Compact Framework、WCF服务、压缩和摘要身份验证
我正在尝试将许多功能组合在一起,由于.NET Compact Framework的局限性,这一点越来越困难 具体来说,我有一个WCF服务,我正在为它编写一个移动设备客户端。陷阱?我想使用某种数据压缩(由于连接到所述设备的调制解调器速度非常慢)和HTTP摘要身份验证(在承载WCF服务的站点上已经存在) 我已经完成了以下步骤,以获得WCF服务客户端所需的压缩和生成的代码 然而,我正在与HTTP摘要作斗争。我不知道如何添加此功能 以前我没有使用压缩,因此我使用SOAP连接到WCF服务,使用一个简单的WebService引用,为了添加HTTP摘要,我必须覆盖C# .NET Compact Framework、WCF服务、压缩和摘要身份验证,c#,wcf,compact-framework,windows-ce,C#,Wcf,Compact Framework,Windows Ce,我正在尝试将许多功能组合在一起,由于.NET Compact Framework的局限性,这一点越来越困难 具体来说,我有一个WCF服务,我正在为它编写一个移动设备客户端。陷阱?我想使用某种数据压缩(由于连接到所述设备的调制解调器速度非常慢)和HTTP摘要身份验证(在承载WCF服务的站点上已经存在) 我已经完成了以下步骤,以获得WCF服务客户端所需的压缩和生成的代码 然而,我正在与HTTP摘要作斗争。我不知道如何添加此功能 以前我没有使用压缩,因此我使用SOAP连接到WCF服务,使用一个简单的W
GetWebRequest
方法并手动添加所需的头。这一次,生成的类似乎没有多少回旋余地,我也没有多少可以重写的余地。此外,所有安全或身份验证参数似乎都是为SSL而设计的,而不是此类基本身份验证方案
总结:如何使用.NET Compact Framework使用压缩和HTTP摘要身份验证创建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);
我怀疑我需要在CustomBinding
类中添加HTTP摘要功能,但我不知道如何添加
我想我还应该注意,当我使用.NET Compact Framework 3.5时,我正在创建一个Windows CE应用程序。因此,我没有费心下载WindowsMobile6SDK。如果这些SDK添加了更多功能,这些功能可以在Windows CE应用程序中使用,并且是HTTP摘要工作所必需的,请告诉我。如果客户端运行在.NET Compact Framework 3.5上,您可以使用WCF调用服务并使用内置的HTTP摘要身份验证支持,而无需SSL 以下是如何以编程方式将WCF客户端配置为使用摘要身份验证: 相关资源:
CFClientBase
也存在可以解决的内存泄漏问题,请参阅:
仅供参考:NetCF支持的WCF子集:我对您的回答有点困惑。具体来说,就是您发布的.config代码。我假设这是针对移动应用程序的,但据我(可能有限)所知,Compact Framework应用程序不支持App.config。因此,我需要在代码中手动设置所有这些绑定。您似乎还忘记了我需要使用前面提到的压缩,这意味着我需要使用
CustomBinding
类。我将编辑我的问题以包含更多细节。@Shaamaan完全正确,.NET Compact Framework不支持应用程序配置文件。我更新了我的答案。很可能我的系统中缺少了一些重要的SDK,或者你忘记了这是.NET Compact Framework。例如,如您所见和所示,HttpTransportBindingElement
的AuthenticationScheme
属性在CFW中不可用,事实上,Visual Studio没有识别这些属性。@Shaaman我确实忘了检查Compact框架是否支持。在这一点上,我唯一的结论是,在紧凑的框架上实现您所要求的可能是不可能的。您可能需要寻找一种不涉及自定义绑定的实现压缩的替代方法。谢谢。然而,我想指出的是,您使用BasicHttpBinding
的建议也是有缺陷的。CFW(,)中缺少TransportCredentialOnly
模式和Digest
凭证类型。因此,您链接的PDF似乎对摘要完全错误,除非它是手动实现的。如果有一种方法可以简单地实现摘要,我很想知道。请让我知道我对类似问题的回答是否可以帮助您@ToniRossmann我们做这个项目是很久以前的事了,我已经发布了我们的解决方案。也就是说,您的答案似乎忘记了我们需要启用压缩功能。我们的应用程序正在使用digest,而基础架构正在围绕这一点工作。我想您的代码可以重写,以使摘要的使用相当容易(因为我们已经不得不手动完成),但我不确定这一切将如何结合在一起,我也不能真正检查,因为我们的原始应用程序已经发展,不再使用任何紧凑的框架元素。
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();
}