C# C“HttpWebRequest”;请求标头“;在JSON POST中

C# C“HttpWebRequest”;请求标头“;在JSON POST中,c#,json,http,web,httpwebrequest,C#,Json,Http,Web,Httpwebrequest,我正在将JSON API翻译成C#方法,我遇到了一个问题,JSON RPC API(POST)说 所有其他方法都需要每个路径参数的身份验证(=sessionId)的结果 ;jsessionid=644AFBF2C1B592B68C6B04938BD26965 或每个cookie(RequestHeader) JSESSIONID=644AFBF2C1B592B68C6B04938BD26965 我当前的WebRequest方法: private async static Task<stri

我正在将JSON API翻译成C#方法,我遇到了一个问题,JSON RPC API(POST)说

所有其他方法都需要每个路径参数的身份验证(=sessionId)的结果

;jsessionid=644AFBF2C1B592B68C6B04938BD26965

或每个cookie(RequestHeader)

JSESSIONID=644AFBF2C1B592B68C6B04938BD26965

我当前的WebRequest方法:

private async static Task<string> SendJsonAndWait(string json, string url, string sessionId) {
        string result;

        HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
        httpWebRequest.ContentType = "application/json";
        httpWebRequest.Method = "POST";

        using(StreamWriter streamWriter = new StreamWriter(await httpWebRequest.GetRequestStreamAsync())) {
            await streamWriter.WriteAsync(json);
            streamWriter.Flush();
            streamWriter.Close();
        }

        HttpWebResponse httpResponse = (HttpWebResponse)await httpWebRequest.GetResponseAsync();
        Stream responseStream = httpResponse.GetResponseStream();
        if(responseStream == null)
            throw new Exception("Response Stream was null!");

        using(StreamReader streamReader = new StreamReader(responseStream)) {
            result = await streamReader.ReadToEndAsync();
        }

        return result;
    }
私有异步静态任务SendJsonAndWait(字符串json、字符串url、字符串sessionId){
字符串结果;
HttpWebRequest HttpWebRequest=(HttpWebRequest)WebRequest.Create(url);
httpWebRequest.ContentType=“应用程序/json”;
httpWebRequest.Method=“POST”;
使用(StreamWriter StreamWriter=newstreamwriter(等待httpWebRequest.GetRequestStreamAsync()){
等待streamWriter.WriteAsync(json);
streamWriter.Flush();
streamWriter.Close();
}
HttpWebResponse httpResponse=(HttpWebResponse)等待httpWebRequest.GetResponseAsync();
Stream responseStream=httpResponse.GetResponseStream();
if(responseStream==null)
抛出新异常(“响应流为空!”);
使用(StreamReader StreamReader=新StreamReader(responseStream)){
结果=等待streamReader.ReadToEndAsync();
}
返回结果;
}
如何将
JSESSIONID
参数添加到我的WebRequest?我对WebRequests不是很熟悉,请简单解释一下


谢谢大家!

您可以将令牌直接添加到您的URL:

HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create($"{url}?jsessionid={sessionId}");
或在标题中:

HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create({url);
httpWebRequest.Headers["JSESSIONID"] = sessionId;
使用

你的案子是这样的

private async static Task<string> SendJsonAndWait(string json, string url, string sessionId) {
    Uri uri = new Uri(url);
    string result;

    HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
    httpWebRequest.ContentType = "application/json";
    httpWebRequest.Method = "POST";

    //Add the JSESSIONID Cookie
    if(httpWebRequest.CookieContainer == null)
            httpWebRequest.CookieContainer = new CookieContainer();

    if(!string.IsNullOrWhiteSpace(sessionId))
            httpWebRequest.CookieContainer.Add(new Cookie("JSESSIONID", sessionId, "/", uri.Host));

    using(StreamWriter streamWriter = new StreamWriter(await httpWebRequest.GetRequestStreamAsync())) {
        await streamWriter.WriteAsync(json);
        streamWriter.Flush();
        streamWriter.Close();
    }

    HttpWebResponse httpResponse = (HttpWebResponse)await httpWebRequest.GetResponseAsync();
    Stream responseStream = httpResponse.GetResponseStream();
    if(responseStream == null)
        throw new Exception("Response Stream was null!");

    using(StreamReader streamReader = new StreamReader(responseStream)) {
        result = await streamReader.ReadToEndAsync();
    }

    return result;
}
私有异步静态任务SendJsonAndWait(字符串json、字符串url、字符串sessionId){
Uri=新的Uri(url);
字符串结果;
HttpWebRequest HttpWebRequest=(HttpWebRequest)WebRequest.Create(url);
httpWebRequest.ContentType=“应用程序/json”;
httpWebRequest.Method=“POST”;
//添加JSESSIONID Cookie
if(httpWebRequest.CookieContainer==null)
httpWebRequest.CookieContainer=新CookieContainer();
如果(!string.IsNullOrWhiteSpace(sessionId))
httpWebRequest.CookieContainer.Add(新Cookie(“JSESSIONID”,sessionId,“/”,uri.Host));
使用(StreamWriter StreamWriter=newstreamwriter(等待httpWebRequest.GetRequestStreamAsync()){
等待streamWriter.WriteAsync(json);
streamWriter.Flush();
streamWriter.Close();
}
HttpWebResponse httpResponse=(HttpWebResponse)等待httpWebRequest.GetResponseAsync();
Stream responseStream=httpResponse.GetResponseStream();
if(responseStream==null)
抛出新异常(“响应流为空!”);
使用(StreamReader StreamReader=新StreamReader(responseStream)){
结果=等待streamReader.ReadToEndAsync();
}
返回结果;
}

您是否尝试直接添加到URL中?正如@RomEh所建议的,您可以将参数作为查询字符串参数添加到URL中,或者您可以使用键
sessionid
json
及其值创建一个dictionary对象,将其序列化为json字符串,然后将其添加到请求流中。我尝试过,我仍然收到服务器的否定响应。我不确定是否是其他原因导致了这个问题。你应该试试{url}?;jsessionid={sessionId}和{url};jsessionid={sessionId}如果它有效。