【问题标题】:Call web API from client app从客户端应用程序调用 Web API
【发布时间】:2014-04-04 19:12:31
【问题描述】:

我曾经使用 ASMX Web 服务,但后来读到(并被告知)从客户端等请求数据的更好方法是将 Web API 与 MVC 结合使用。

我创建了一个 MVC 4 Web api 应用程序并开始了解它的工作原理。

目前我的 valuesControllers 中有一个公共字符串 -

public class ValuesController : ApiController
{


    // GET api/values/5
    public string Get(int id)
    {
        return "value";
    }

}

我目前正试图在我的客户中这样称呼它 -

class Product
    {
        public string value { get; set; }
    }

protected void Button2_Click(object sender, EventArgs e)
    {
        RunAsync().Wait();
    }

    static async Task RunAsync()
    {
        using (var client = new HttpClient())
        {
            try
            {
                client.BaseAddress = new Uri("http://localhost:12345/");
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

                // HTTP GET
                HttpResponseMessage response = await client.GetAsync("api/values/5");
                if (response.IsSuccessStatusCode)
                {
                    Product product = await response.Content.ReadAsAsync<Product>();
                    Console.WriteLine("{0}", product.value);
                }
            }
            catch(Exception ex)
            {
                Console.WriteLine(ex.Message.ToString());
            }
        }
    }

在调试时,我可以单步执行请求并成功输入 Web API 代码,但是在线 -

Product product = await response.Content.ReadAsAsync<Product>();

这失败并进入我的捕获异常 -

Error converting value "value" to type 'myDemo.Home+Product'. Path '', line 1, position 7.

这是为什么?

【问题讨论】:

  • 因为它是String,而不是Product

标签: c# asp.net-mvc asp.net-web-api


【解决方案1】:

这是为什么?

因为从您的控制器操作中,您返回的是 string,而不是 Product,它们是两种截然不同的类型:

public string Get(int id)
{
    return "value";
}

因此,请确保您始终如一地读取客户端上的值:

if (response.IsSuccessStatusCode)
{
    string result = await response.Content.ReadAsAsync<string>();
    Console.WriteLine("{0}", result);
}

当然,如果您修改了 API 控制器操作以返回产品:

public Product Get(int id)
{
    Product product = ... go fetch the product from the identifier
    return product;
}

您的客户端代码将按预期工作。

【讨论】:

  • 绝对正确,我犯了愚蠢的错误,我会在 T 减去 7 分钟内接受答案。
猜你喜欢
  • 2016-10-10
  • 2021-04-25
  • 1970-01-01
  • 1970-01-01
  • 2018-12-20
  • 1970-01-01
  • 2017-10-09
  • 1970-01-01
  • 2015-03-07
相关资源
最近更新 更多