【问题标题】:ASP.Net httpwebrequest not posting request bodyASP.Net httpwebrequest 不发布请求正文
【发布时间】:2017-09-14 02:56:01
【问题描述】:

我的双手举在空中——我哭了,叔叔。帮助我理解:

我写了一个简单的 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# 代码中没有看到任何不正确的地方。还有什么想法可以看吗?客户是否可以在其托管站点上阻止或过滤掉某个请求?我被困住了。

【问题讨论】:

  • 更新:我找到了如何配置 ASP.net 让 Fiddler 充当代理。 GlobalProxySelection.Select = new WebProxy("127.0.0.1", 8888);我看到了我的标题,但 Content-Length 设置为 0 并且没有发送任何内容。为什么?

标签: c# asp.net json


【解决方案1】:

因此,对于任何想知道的人......您必须在执行 .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!!

我希望这对其他人有所帮助,因为我花了两周时间来解决这个遗漏。咻。

【讨论】:

  • 使用using语句代替手动关闭流,因为StreamWriter实现了IDisposable接口,一旦您的程序退出using语句,它就会自动处理流
【解决方案2】:

我会这样发帖:

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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-13
    • 1970-01-01
    • 1970-01-01
    • 2018-02-23
    • 2017-11-21
    • 1970-01-01
    相关资源
    最近更新 更多