我正在玩一个使用HttpWebRequest
的应用来与网络服务器对话。
我按照我在网上找到的标准说明来构建我的请求函数,我尽量使其尽可能通用(我试着获得一个独特的方法,无论方法如何:PUT,POST,DELETE,REPORT,... )
当我提交“REPORT”请求时,我的服务器上有两个访问日志:
1)在调试器中启动以下行后,我得到响应401
reqStream.Write(Encoding.UTF8.GetBytes(body), 0, body.Length);
2)在通过调用Request.GetResponse();
的行后,我得到了响应207(多次获取,这是我的期望)
实际上,它似乎是第一次查询服务器的Request.GetRequestStream()
行,但请求只在通过reqStream.Write(...)
行后提交...
对于PUT和DELETE,Request.GetRequestStream()
再次在我的服务器上生成401访问日志,而Request.GetResponse();
返回代码204.
我不明白为什么对于一个唯一的请求我有两个服务器访问日志,特别是一个似乎什么都不做,因为它总是返回代码401 ...任何人都可以解释发生了什么上?由于我试图获得多种方法的通用代码,这是我的代码中的缺陷还是糟糕的设计?
这是我的完整代码:
public static HttpWebResponse getHttpWebRequest(string url, string usrname, string pwd, string method, string contentType,
string[] headers, string body) {
// Variables.
HttpWebRequest Request;
HttpWebResponse Response;
//
string strSrcURI = url.Trim();
string strBody = body.Trim();
try {
// Create the HttpWebRequest object.
Request = (HttpWebRequest)HttpWebRequest.Create(strSrcURI);
// Add the network credentials to the request.
Request.Credentials = new NetworkCredential(usrname.Trim(), pwd);
// Specify the method.
Request.Method = method.Trim();
// request headers
foreach (string s in headers) {
Request.Headers.Add(s);
}
// Set the content type header.
Request.ContentType = contentType.Trim();
// set the body of the request...
Request.ContentLength = body.Length;
using (Stream reqStream = Request.GetRequestStream()) {
// Write the string to the destination as a text file.
reqStream.Write(Encoding.UTF8.GetBytes(body), 0, body.Length);
reqStream.Close();
}
// Send the method request and get the response from the server.
Response = (HttpWebResponse)Request.GetResponse();
// return the response to be handled by calling method...
return Response;
}
catch (Exception e) {
throw new Exception("Web API error: " + e.Message, e);
}