当我指定凭据时,为什么我的 Http 客户端会发出 2 个请求?

2024-01-29

我创建了 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;
                    }
                }
            }

因此,这段代码获取了我的资源并将其反序列化。如您所见 - 我正在通话中传递凭据。

然后,在服务器端调试时,我注意到每次都会收到 2 个请求 - 一个没有身份验证标头,然后服务器发回响应,第二个请求带有凭据。我认为这对我的服务器不利 - 我宁愿不进行任何往返。我应该如何更改客户端才能避免这种情况发生?查看 Fiddler 的屏幕截图

EDIT:

这是我从 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,因为身份验证是通过互联网以纯文本形式进行的。 (实际上你所显示的似乎是通过内联网进行的,但是如果你do通过互联网使其成为 https)。

以下是维基百科的链接,可能会对您有进一步帮助:http://en.wikipedia.org/wiki/Basic_access_authentication http://en.wikipedia.org/wiki/Basic_access_authentication

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当我指定凭据时,为什么我的 Http 客户端会发出 2 个请求? 的相关文章

随机推荐