0

我写了一个测试登录页面(.aspx),它有一个 Postback 方法和第二个静态 Webmethod 调用。javascript 函数从“txt1”和“txt2”中获取值并调用 C# [WebMethod]

HTML:

<input type="text" id="txt1" />
<input type="text" id="txt2" />

//JS function sends values to C# WebMethod
PageMethods.ReceiveUsernamePassword(txt1.value, txt2.value);

C#:

    [WebMethod]
    public static string ReceiveUsernamePassword(string user, string pass)
    {
        File.AppendAllText(@"C:\Z\upjs.txt", user + " " + pass + " js " + "\r\n\r\n\r\n");
        return "Success JS";
    }

使用以下代码模拟 POST 的单独客户端应用程序。URL 指向 localhost:1073/PostData_Server/Default.aspx/ReceiveUsernamePassword:

using (WebClient client = new WebClient())
        {
            System.Collections.Specialized.NameValueCollection reqparm = new System.Collections.Specialized.NameValueCollection();
            reqparm.Add("user", "user1");
            reqparm.Add("pass", "password1");
            byte[] responsebytes = client.UploadValues("http://local:1073/PostData_Server/Default.aspx", "POST", reqparm);
            string responsebody = Encoding.UTF8.GetString(responsebytes);
        }

Firebug POST 数据

萤火虫响应

我没有在我的测试客户端应用程序上获得“Success”或“Success JS”,而是接收到整个 HTML 文档作为响应消息。服务器端也没有写入文本文件。我通过下载海报(https://addons.mozilla.org/en-us/firefox/addon/poster/)验证了这不是我的客户端应用程序中的错误。它也接收整个 HTML 文档作为响应。我该如何纠正?

4

1 回答 1

0

只是想我会更新我在这个问题上的发现。事实证明,为了调用 [WebMethod],必须将 ContentType 设置为“application/json”。您也不能使用 WebClient.UploadValues() 因为它不会让您更改 ContentType。因此,为了发送正确的 POST 签名,您必须使用 HttpWebRequest 类。

另请注意:发送的用户名和密码必须为 json 格式!

    HttpWebRequest myHttpWebRequest = (HttpWebRequest)HttpWebRequest.Create(URL);
    myHttpWebRequest.Method = "POST";
    myHttpWebRequest.ContentType = "application/json; encoding=utf-8";

    using (var streamWriter = new StreamWriter(myHttpWebRequest.GetRequestStream()))
    {
        string json = "{user:\"user1\",pass:\"pass1\"}";

        streamWriter.Write(json);
        streamWriter.Flush();
    }

    var httpResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
    using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
    {
        responsebody = streamReader.ReadToEnd();
    }
于 2014-05-05T18:06:56.977 回答