【问题标题】:C# Api controller not receiving json parameterC# Api 控制器未接收到 json 参数
【发布时间】:2018-10-29 19:46:41
【问题描述】:

我正在尝试创建一个基本的测试 web api,并使用标准控制器来测试调用它。 当我运行它时,通过放置 http://localhost:55144/home/testapi

它将运行捕手功能并完全忽略该参数。 然后,捕手会愉快地返回一个值,这可以在调用代码中看到。

我尝试了各种组合,将 [FromBody] 放入,更改 TestApiMethod 中的参数类型,并查看制作列表或数组是否有任何不同。

我注意到一些奇怪的事情: - 我没有使用 TestApiMethod 代码中的参数,但 Visual Studio 没有给我未使用的变量警告。 - 如果我将参数 testString 的类型设为字符串甚至整数,下面的代码将路由到捕手。如果我使它成为模型或 Jobject 的某种变体,它不会。它一直在运行

HttpResponseMessage response = await client.PostAsJsonAsync("api/activity", sendData);

然后返回网页。

代码如下:

模型

public class testStringModel
{
        public string testString { get; set; }
}

public class apiResponse
{
    public string response { get; set; }
}

Home 控制器调用 Api:

   public void TestApi()
    {
        Task myTask = testApiCall();
    }


    private async Task<string> testApiCall()
    {
        HttpClient client = new HttpClient();
        client.BaseAddress = new Uri("http://localhost:55144");

        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(
            new MediaTypeWithQualityHeaderValue("application/json"));

        testStringModel data = new testStringModel { testString = "cheese" };
        string jsonData = JsonConvert.SerializeObject(data);
        var sendData = new StringContent(jsonData, Encoding.UTF8, "application/json");
        //var sendData = new Dictionary<string, string>
        //{
        //  {"testString", "cheese"}
        //};


        HttpResponseMessage response = await client.PostAsJsonAsync("api/activity", sendData);
        string responseBodyAsText = await response.Content.ReadAsStringAsync();

        dynamic stuff = JObject.Parse(responseBodyAsText);
        string finalResponse = stuff.response;


        return finalResponse;

        }
    }

API:

namespace ApplicationActivity
{
public class ActivityController : ApiController
{
    [System.Web.Http.HttpPost]
    public HttpResponseMessage Catcher()
    {
        apiResponse apiResponseObject = new apiResponse();
        apiResponseObject.response = "You have somehow wound up in the catcher";

        string json = JsonConvert.SerializeObject(apiResponseObject);

        HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK, "value");
        response.Content = new StringContent(json, Encoding.Unicode, "application/json");
        response.Headers.CacheControl = new CacheControlHeaderValue()
        {
            MaxAge = TimeSpan.FromMinutes(20)
        };
        return response;

    }

    [System.Web.Http.HttpPost]
    public HttpResponseMessage TestApiMethod(string testString)
    {
        apiResponse apiResponseObject = new apiResponse();
        apiResponseObject.response = "OK from test";

        string json = JsonConvert.SerializeObject(apiResponseObject);

        HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK, "value");
        response.Content = new StringContent(json, Encoding.Unicode, "application/json");
        response.Headers.CacheControl = new CacheControlHeaderValue()
        {
            MaxAge = TimeSpan.FromMinutes(20)
        };
        return response;

    }     
}

}

请你告诉我我的代码有什么问题,如何修复它以及当代码没有到达捕手时发生了什么?

谢谢。

【问题讨论】:

  • 您的代码看起来正确。我不知道它是否有任何区别,但我的代码在创建HttpClient之后有:client.DefaultRequestHeaders.Add("User-Agent", "My app name");
  • 你试过了吗:HttpResponseMessage response = await client.PostAsJsonAsync("api/activity", data);public HttpResponseMessage TestApiMethod(testStringModel testString)
  • @Rick,感谢您的关注。当我尝试您的建议时,它会显示空白页面。两个控制器中的断点均未命中。
  • 另一位用户在此处发表评论并删除了该评论。他/她指的是这个问题:stackoverflow.com/questions/9569270/… 也许这有点相关......

标签: c# asp.net-mvc rest


【解决方案1】:

事实证明,我使用的是旧版本的 Visual Studio,因此整个事情真的很困惑是否正在运行 .net 核心。 升级到最新并确保安装了最新的 .net 核心解决了我的大部分麻烦

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-23
    • 2017-09-19
    • 2015-01-08
    • 2018-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多