【问题标题】:call HttpPost method from Client in C# code在 C# 代码中从客户端调用 HttpPost 方法
【发布时间】:2014-11-18 09:28:56
【问题描述】:

我是 MVC 和 C# 的新手,如果这个问题看起来太简单了,很抱歉。

对于像下面这样的 HttpPost 控制器,如何在没有浏览器的情况下直接从用 C# 编写的客户端程序调用此方法(NOT 从带有提交按钮的浏览器中的 UI 表单)?我正在使用 .NET 4 和 MVC 4。

我确信答案在网络上,但到目前为止还没有找到。任何帮助表示赞赏!

[HttpPost]
public Boolean PostDataToDB(int n, string s)
{
    //validate and write to database
    return false;
}

【问题讨论】:

标签: c# asp.net-mvc http-post


【解决方案1】:

例如在服务器端使用此代码:

[HttpPost]
public Boolean PostDataToDB(int n, string s)
{
    //validate and write to database
    return false;
}

您可以使用不同的方法:

WebClient

using (var wb = new WebClient())
{
    var data = new NameValueCollection();
    data["n"] = "42";
    data["s"] = "string value";
    
    var response = wb.UploadValues("http://www.example.org/receiver.aspx", "POST", data);
}

HttpRequest

var request = (HttpWebRequest)WebRequest.Create("http://www.example.org/receiver.aspx");

var postData = "n=42&s=string value";
var data = Encoding.ASCII.GetBytes(postData);

request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = data.Length;

using (var stream = request.GetRequestStream())
{
    stream.Write(data, 0, data.Length);
}

var response = (HttpWebResponse)request.GetResponse();
var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();

HttpClient

using (var client = new HttpClient())
{
    var values = new List<KeyValuePair<string, string>>();
    values.Add(new KeyValuePair<string, string>("n", "42"));
    values.Add(new KeyValuePair<string, string>("s", "string value"));

    var content = new FormUrlEncodedContent(values);

    var response = await client.PostAsync("http://www.example.org/receiver.aspx", content);

    var responseString = await response.Content.ReadAsStringAsync();
}

WebRequest

WebRequest request = WebRequest.Create ("http://www.example.org/receiver.aspx");
request.Method = "POST";
string postData = "n=42&s=string value";
byte[] byteArray = Encoding.UTF8.GetBytes (postData);
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = byteArray.Length;
Stream dataStream = request.GetRequestStream ();
dataStream.Write (byteArray, 0, byteArray.Length);
dataStream.Close ();
            
//Response
WebResponse response = request.GetResponse ();
Console.WriteLine (((HttpWebResponse)response).StatusDescription);
dataStream = response.GetResponseStream ();
StreamReader reader = new StreamReader (dataStream);
string responseFromServer = reader.ReadToEnd ();
Console.WriteLine (responseFromServer);
reader.Close ();
dataStream.Close ();
response.Close ();

msdn

【讨论】:

  • @Ludovic-来自浏览器?真的吗??
  • @RahulSingh 引用问题:“来自用 C# 编写的客户端程序,没有浏览器
  • @RahulSingh OP 要求提供客户端程序
  • @Ludovic 感谢所有方法!我花了一段时间才意识到服务器端的参数参数应该与客户端匹配。再次感谢!
  • @dragon_cat 对不起,我没有使用你的参数!我将编辑我的帖子以显示它必须与服务器端参数匹配:)
【解决方案2】:

你可以使用 首先你应该返回有效的结果:

[HttpPost]
public ActionResult PostDataToDB(int n, string s)
{
    //validate and write to database
    return Json(false);
}

之后,您可以使用 Web Api 客户端库 NuGet 包中的 HttpClient 类:

public async bool CallMethod()
{
    var rootUrl = "http:...";
    bool result;
    using (var client = new HttpClient())
    {
        client.BaseAddress = new Uri(_rootUrl);
        var response= await client.PostAsJsonAsync(methodUrl, new {n = 10, s = "some string"}); 
        result = await response.Content.ReadAsAsync<bool>();
    }

    return result;
}

你也可以使用 WebClient 类:

[HttpPost]
public Boolean PostDataToDB(int n, string s)
{
    //validate and write to database
    return false;
}

public async bool CallMethod()
    {
        var rootUrl = "http:...";
        bool result;
        using (var client = new WebClient())
        {
            var col = new NameValueCollection();
            col.Add("n", "1");
            col.Add("s", "2");
            var res = await client.UploadValuesAsync(address, col);
            string res = Encoding.UTF8.GetString(res);

            result = bool.Parse(res);
        }

    return result;
}

【讨论】:

  • +1 用于显示参数名称,例如“n”,“s”应该在客户端和服务器中匹配。
【解决方案3】:

如果你决定使用 HttpClient 实现。不要为每次调用 API 创建和处置 HttpClient。相反,重用 HttpClient 的单个实例。您可以通过将实例声明为静态或实现单例模式来实现。

参考:https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/

如何实现单例(很好的起点,阅读该帖子中的 cmets):https://codereview.stackexchange.com/questions/149805/implementation-of-a-singleton-httpclient-with-generic-methods

【讨论】:

    【解决方案4】:

    希望下面的代码对你有所帮助

    [ActionName("Check")]
    public async System.Threading.Tasks.Task<bool> CheckPost(HttpRequestMessage request)
    {
        string body = await request.Content.ReadAsStringAsync();
        return true;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多