这个(借用/改编的)代码中是否缺少一些东西,或者我没有看到 Get 在哪里被触发

本文关键字:或者 在哪里 Get 借用 代码 是否 这个 | 更新日期: 2023-09-27 18:36:23

我在这里发布了一个发送HttpWebRequest的问题,但是仔细观察我的方法SendHTTPRequestNoCredentials(),我确定我改编自我过去一段时间在StackOverflow上找到的东西,似乎缺少了什么。看看这在你看来是否可疑,当 Http 方法是 Get 时:

public static HttpWebRequest SendHTTPRequestNoCredentials(string uri, HttpMethods method, 
    string data, string contentType)
{
    WebRequest request = null;
    try
    {
        request = WebRequest.Create(uri);
        request.Method = Enum.ToObject(typeof(HttpMethods), method).ToString();
        request.ContentType = contentType;
        ((HttpWebRequest)request).Accept = contentType;
        ((HttpWebRequest)request).KeepAlive = false;
        ((HttpWebRequest)request).ProtocolVersion = HttpVersion.Version10;
        if (method != HttpMethods.GET && method != HttpMethods.DELETE)
        {
            byte[] arrData = Encoding.UTF8.GetBytes(data);
            request.ContentLength = arrData.Length;
            using (Stream oS = request.GetRequestStream())
            {
                oS.Write(arrData, 0, arrData.Length);
            }
        }
        else
        {
            request.ContentLength = 0;
        }
        //((HttpWebRequest)request). // <= should this call "GetRequestStream())" or 
"BeginGetResponse" or "GetResponse" or "RequestUri" or ... ???
    }
    catch (Exception ex)
    {
        String msgInnerExAndStackTrace = String.Format(
                "{0}; Inner Ex: {1}; Stack Trace: {2}", ex.Message, ex.InnerException, 
ex.StackTrace);
        ExceptionLoggingService.Instance.WriteLog(String.Format("From 
FileXferREST.SendHTTPRequestNoCredentials(): {0}", msgInnerExAndStackTrace));
    }
    return request as HttpWebRequest;
}
即使

http 类型是"Get",也不应该显式"发送"HttpWebRequest 吗?我是否需要在上面注释掉的行中添加一些内容,或者我需要更改此部分:

if (method != HttpMethods.GET && method != HttpMethods.DELETE)
{
    byte[] arrData = Encoding.UTF8.GetBytes(data);
    request.ContentLength = arrData.Length;
    using (Stream oS = request.GetRequestStream())
    {
        oS.Write(arrData, 0, arrData.Length);
    }
}
else
{
    request.ContentLength = 0;
}

。对此:

byte[] arrData = null;
if (method != HttpMethods.GET && method != HttpMethods.DELETE)
{
    arrData = Encoding.UTF8.GetBytes(data);
    request.ContentLength = arrData.Length;
}
else
{
    request.ContentLength = 0;
}
using (Stream oS = request.GetRequestStream())
{
    oS.Write(arrData, 0, arrData.Length);
}

。否则,当http方法== GET时,实际上如何调用REST方法???

更新

或者重构真的应该是这样的:

public static HttpWebResponse SendHTTPRequestNoCredentials(string uri, HttpMethods method, 
    string data, string contentType)
{
    . . .
    HttpWebResponse response = request.GetResponse() as HttpWebResponse;
    return response;
}

(IOW,将返回类型从 HttpWebRequest 更改为 HttpWebResponse,并将上面显示的这两行附加到方法的末尾)?

这个(借用/改编的)代码中是否缺少一些东西,或者我没有看到 Get 在哪里被触发

该方法设置在request.Method = Enum.ToObject(typeof(HttpMethods), method).ToString();行中,因此代码片段看起来不错。呼叫请求。GetResponse() 或请求。BeginGetResponse() 来执行该操作。