控制台应用程序使用HttpClient向MVC Web API进行POST请求

6
我有一个默认的mvc web api实例,它是从Visual Studio 2012模板构建的。它具有以下路由和Post方法在默认的ValuesController中——MVC网站在初始创建后除了Post方法的内容没有修改。另外,我使用.NET框架4.0,因为我计划针对Azure进行目标定位。
注册方法
public static void Register(HttpConfiguration config)
{
    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );
}

和Post方法

    // POST api/values
    public string Post([FromBody]string value)
    {
        if (value != null)
        {
            return "Post was successful";
        }
        else
            return "invalid post, value was null";
    }

我创建了一个控制台应用程序,使用HttpClient模拟向服务发送POST请求,但不幸的是,“value”始终为null。在HttpClient上进行PostAsync调用后,Post方法成功执行。

目前并不清楚如何映射我的请求,使得value包含我传递的StringContent...

    static void Main(string[] args)
    {
        string appendUrl = string.Format("api/values");
        string totalUrl = "http://localhost:51744/api/values";
        HttpClient client = new HttpClient();
        client.DefaultRequestHeaders.Add("Accept", "application/xml");

        string content = "Here is my input string";
        StringContent sContent = new StringContent(content, Encoding.UTF8, "application/xml");

        HttpResponseMessage response = null;
        string resultString = null;

        client.PostAsync(new Uri(totalUrl), sContent).ContinueWith(responseMessage =>
            {
                response = responseMessage.Result;
            }).Wait();

        response.Content.ReadAsStringAsync().ContinueWith(stream =>
            {
                resultString = stream.Result;
            }).Wait();          
    }

我刚接触MVC Web API和HttpClient,希望能得到帮助,指点我方向,将不胜感激。

1个回答

6

请尝试以下代码:

class Program {

    static void Main(string[] args) {

        HttpClient client = new HttpClient();
        var content = new StringContent("=Here is my input string");
        content.Headers.ContentType = new MediaTypeHeaderValue("application/x-www-form-urlencoded");
        client.PostAsync("http://localhost:2451/api/values", content)
            .ContinueWith(task => {

                var response = task.Result;
                Console.WriteLine(response.Content.ReadAsStringAsync().Result);
            });

        Console.ReadLine();
    }
}

请查看此博客文章的"发送简单类型"部分:http://www.asp.net/web-api/overview/working-with-http/sending-html-form-data,-part-1

1
太棒了!我原来的代码中缺少的两个部分是等号(用于简单类型)和ContentType。添加这两个部分解决了问题。 - jtoth3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接