繁体   English   中英

ASP.Net httpwebrequest 未发布请求正文

[英]ASP.Net httpwebrequest not posting request body

我的手在空中 - 我哭了,叔叔。 帮我理解:

我写了一个简单的 HttpWebRequest 发布到客户的https://website 它具有特定的标头要求和 JSON 请求正文。 GetResponseStream 在收到 GetResponse StatusCode.OK 后,是其服务器提供的错误。 他们检查了他们的日志并说当标题存在时,请求正文是“。

这是我的代码:

    public const string API_URILogin = "https://dev.clientURL.com/test/api/login";
    private void RequestTest()
    {
        LoginAPIStruct loginInfo = new LoginAPIStruct();

        loginInfo.loginId = TestId;
        loginInfo.password = TestPw;
        loginInfo.vehicleType = "E";
        loginInfo.deviceId = "ABCDEF";
        loginInfo.clientId = "123456";
        loginInfo.appVersion = string.Empty;
        loginInfo.osType = string.Empty;
        loginInfo.osVersion = string.Empty;

        // Call LoginAPI
        string loginStatus = LoginAPI(loginInfo);
        //Display Results
        lblResults.Text = loginStatus;
    }


    // Public Variables
    public static string errorMessage;

    // ** Client Login **
    public static string LoginAPI(LoginAPIStruct loginInfo)
    {
        // Post Login to Client.  Get response with Vehicle structure.  
        string loginInfoSerialized = string.Empty;
        string returnString = string.Empty;

        loginInfoSerialized = new JavaScriptSerializer().Serialize(loginInfo);

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(API_URILogin);
        request.Method = "POST";
        request.ContentType = "application/json";
        request.Headers.Add("From", "CC");
        request.Headers.Add("Language", "0");
        request.Headers.Add("Offset", "-8");
        request.Headers.Add("To", "CCM");

        // Post Request
        using (StreamWriter streamPost = new StreamWriter(request.GetRequestStream()))
        {
            streamPost.Write(loginInfoSerialized);
        }

        // Get Response
        HttpWebResponse response = (HttpWebResponse)request.GetResponse();

        if (response.StatusCode == HttpStatusCode.OK)
        {
            // Status Okay.
            //string responseStatusDescription = response.StatusDescription;

            using (var streamReader = new StreamReader(response.GetResponseStream()))
            {
                try
                {
                    var result = streamReader.ReadToEnd();

                    returnString = result;
                }
                catch (Exception ex)
                {
                    returnString = ex.Message;
                }

            }
        }
        else
        {
            returnString = response.StatusCode.ToString();
        }

        return returnString;
    }   // end LoginAPI

我的 JSON 字符串似乎是有效的 - 我将它粘贴到 Fiddler 中,并设置标题,然后 Fiddler 返回成功登录。

从 ASP.Net,它返回他们记录的错误,即需要电子邮件地址 (loginId)。 我在 C# 代码中没有看到任何不正确的内容。 任何想法在哪里看? 客户是否可以在其托管站点上阻止或过滤某个请求? 我被困住了。

所以,对于任何想知道的人......你必须在执行 .Write(payload) 命令后“关闭”StreamWriter,否则它实际上不会发送数据。

    // Post Request
        StreamWriter streamPost = new StreamWriter(request.GetRequestStream());
        streamPost.Write(loginInfoSerialized);
        streamPost.Close();    //Don't forget to Close() or no data sent!!

我希望这能帮助其他人,因为我花了两周的时间来解决这个遗漏。 再见。

我会像这样发帖:

ASCIIEncoding encoding = new ASCIIEncoding();
byte[] byte1 = encoding.GetBytes(loginInfoSerialized);

request.ContentType = "application/json";
request.ContentLength = byte1.Length;
Stream stream = request.GetRequestStream();
stream.Write(byte1, 0, byte1.Length);
stream.Close();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM