c# – 为什么我的Http客户端在指定凭据时发出2个请求?

前端之家收集整理的这篇文章主要介绍了c# – 为什么我的Http客户端在指定凭据时发出2个请求?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我创建了RESTful Web服务(WCF),其中我检查每个请求的凭据.我的一个客户是 Android应用程序,一切似乎在服务器端都很棒.我得到请求,如果它有适当的标题 – 我处理它等.

现在我创建了使用此服务的客户端应用程序.这是我如何做GET:

// Create the web request  
            var request = WebRequest.Create(Context.ServiceURL + uri) as HttpWebRequest;

            if (request != null)
            {
                request.ContentType = "application/json";

                // Add authentication to request  
                request.Credentials = new NetworkCredential(Context.UserName,Context.Password);

                // Get response  
                using (var response = request.GetResponse() as HttpWebResponse)
                {
                    // Get the response stream  
                    if (response != null)
                    {
                        var reader = new StreamReader(response.GetResponseStream());

                        // Console application output
                        var s = reader.ReadToEnd();

                        var serializer = new JavaScriptSerializer();
                        var returnValue = (T)serializer.Deserialize(s,typeof(T));

                        return returnValue;
                    }
                }
            }

所以,这个代码是我的资源,反序列化它.正如你所看到的 – 我在通话中传递凭证.

那么当在服务器端进行调试时,我注意到我每次收到两个请求 – 一个没有认证头,然后服务器发回回应,第二个请求来自bach与凭据.我认为这对我的服务器是坏的 – 我宁愿不做任何往返.我应该如何更改客户端,以免发生这种情况?见Fiddler的屏幕截图

编辑:

这是我从Android使用的JAVA代码 – 它不会进行双重调用

MyHttpResponse response = new MyHttpResponse();
        HttpClient client = mMyApplication.getHttpClient();

        try
        {
            HttpGet request = new HttpGet(serviceURL + url);
            request.setHeader(new BasicHeader(HTTP.CONTENT_TYPE,"application/json"));
            request.addHeader("Authorization","Basic " + Preferences.getAuthorizationTicket(mContext));

            ResponseHandler<String> handler = new BasicResponseHandler();
            response.Body = client.execute(request,handler);
            response.Code = HttpURLConnection.HTTP_OK;
            response.Message = "OK";
        }
        catch (HttpResponseException e)
        {
            response.Code = e.getStatusCode();
            response.Message = e.getMessage();

            LogData.InsertError(mContext,e);
        }

解决方法

初始请求没有指定认证的基本头.另外,由于指定了一个域,所以必须从服务器获取这个域.所以你必须问一次:“嘿,我需要这些东西”,服务器是“你是谁,回答的领域是”安全区域“. (因为领域意味着这里的东西)只是因为你在这里添加
request.Credentials = new NetworkCredential(Context.UserName,Context.Password);

这并不意味着这是要确保附加每一次的请求.

然后,您用用户名/密码(在这种情况下您正在做BASIC,因此它是base64编码为名称:密码)并且服务器解码它,并说“好的,你清楚,这里是你的数据”.

这将会定期发生,而且你可以做很多事情.我建议您也打开HTTPS,因为身份验证通过互联网以纯文本形式发生. (实际上你显示内容似乎在内联网上,但如果你通过互联网使它成为https).

这里是维基百科的链接,可能有助于您进一步:http://en.wikipedia.org/wiki/Basic_access_authentication

猜你在找的C#相关文章