Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NET Compact Framework、WCF服务、压缩和摘要身份验证_C#_Wcf_Compact Framework_Windows Ce - Fatal编程技术网

C# .NET Compact Framework、WCF服务、压缩和摘要身份验证

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

我正在尝试将许多功能组合在一起,由于.NET Compact Framework的局限性,这一点越来越困难

具体来说,我有一个WCF服务,我正在为它编写一个移动设备客户端。陷阱?我想使用某种数据压缩(由于连接到所述设备的调制解调器速度非常慢)和HTTP摘要身份验证(在承载WCF服务的站点上已经存在)

我已经完成了以下步骤,以获得WCF服务客户端所需的压缩和生成的代码

然而,我正在与HTTP摘要作斗争。我不知道如何添加此功能

以前我没有使用压缩,因此我使用SOAP连接到WCF服务,使用一个简单的WebService引用,为了添加HTTP摘要,我必须覆盖
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客户端配置为使用摘要身份验证:

相关资源:


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

实现这一点的唯一方法是使用HttpWebRequest(手动)并指定ClientCredentials,而不是从不支持身份验证的NetCFSvcUtil生成的类。 它在CF with WCF上支持的唯一WS-Security规范是通过相互证书交换有效地使用消息安全性。(顺便说一下,我和一位同事发现了内存泄漏:)

需要注意的是,生成的
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();
}