我创建了 RESTful 网络服务 (WCF),我在其中检查每个请求的凭据。我的一个客户是 Android 应用程序,服务器端的一切似乎都很棒。我收到请求,如果它有正确的 header - 我会处理它,等等。
现在我创建了使用此服务的客户端应用程序。这就是我获取 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 个请求 - 一个没有身份验证 header ,然后服务器发回响应,第二个请求带有凭据。我认为这对我的服务器不利 - 我宁愿不进行任何往返。我应该如何更改客户端以免发生这种情况?查看 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);
}
最佳答案
初始请求从未指定用于身份验证的基本 header 。此外,由于指定了领域,因此您必须从服务器获取该领域。所以你必须问一次:“嘿,我需要这个东西”,服务器会说“你是谁?回答的范围是‘安全区域’。” (因为领域在这里意味着什么)只是因为你在这里添加了它:
request.Credentials = new NetworkCredential(Context.UserName, Context.Password);
并不意味着它每次都会附加到请求中。
然后您使用用户名/密码进行响应(在本例中,您使用的是 BASIC,因此它的 base64 编码为名称:密码),服务器对其进行解码并说“好的,你很清楚,这是你的数据”。
这将定期发生,对此您无能为力。我建议您也打开 HTTPS,因为身份验证是通过 Internet 以纯文本形式进行的。 (实际上您显示的内容似乎是通过 Intranet 显示的,但如果您确实通过 Internet 将其设为 https)。
这是维基百科的链接,可能对您有进一步的帮助:http://en.wikipedia.org/wiki/Basic_access_authentication
关于c# - 为什么我的 Http 客户端在我指定凭据时发出 2 个请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6338942/