WCF Data Service是OData协议,也是RESTFul Service的一种,上篇文章已经介绍了HTTP Basic Authentication for RESTFul Service,也介绍了服务端如何设置。现在我们来一下客户端怎么样调用。
按照OData and Authentication – Part 6 – Custom Basic Authentication的介绍的方法调用:
1: Entities ctx = new Entities(new Uri("http://localhost:8080/YupskyDataService.svc"));
2: var serviceCreds = new NetworkCredential("admin", "admin");
3: var cache = new CredentialCache();
4: var serviceUri = new Uri("http://localhost:8080/YupskyDataService.svc");
5: cache.Add(serviceUri, "Basic", serviceCreds);
6: ctx.Credentials = cache;
7: ctx.SendingRequest += new EventHandler<SendingRequestEventArgs>(OnSendingRequest);
8:
9: static void OnSendingRequest(object sender, SendingRequestEventArgs e)
10: {
11: var creds = "user" + ":" + "password";
12: var bcreds = Encoding.ASCII.GetBytes(creds);
13: var base64Creds = Convert.ToBase64String(bcreds);
14: e.RequestHeaders.Add("Authorization", "Basic " + base64Creds);
15: }
上面的代码可以完成http方式的调用,如果是https方式调用就会出现错误:
“The remote certificate is invalid according to the validation procedure”
[WebException: The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel.]
此时需要进行强制验证通过,解决方法是在执行你的代码之前先回调一个名为ServicePointManager的类,每当http客户端的堆栈进行证书验证时,都会检查是否可以回调,如果可以,则执行你你的代码。而要挂接该回调,则必须提供类型RemoteCertificateValidationCallback的一个委托,在调用之前加入如下代码:
1: ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(OnValidationCallback);
2:
3: public bool OnValidationCallback(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors errors)
4: {
5: //不管服务端证书怎么样,都通过校验,嘿嘿
return true;
6: }
相关阅读