C#Api控制器未收到json参数

时间:2018-06-28 14:07:56

标签: c# asp.net-mvc rest

我正在尝试创建一个基本的测试Web api,并使用标准控制器对其进行测试。 当我运行它时,     http://localhost:55144/home/testapi

它将运行catcher函数并完全忽略该参数。 然后,捕获器将愉快地返回一个值,该值可以在调用代码中看到。

我尝试了各种组合,包括[FromBody],在TestApiMethod中更改参数的类型以及查看创建列表或数组是否有区别。

我注意到一些奇怪的事情: -我没有在TestApiMethod的代码中使用该参数,但是Visual Studio并未向我发出未使用的变量警告。 -如果我将参数testString的类型设置为字符串甚至是int,则下面的代码将路由到捕获器。如果我对模型或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; }
}

家庭控制器调用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;

    }     
}

}

请您告诉我我的代码在做什么错,如何解决它以及当代码没有到达捕获器时会发生什么情况?

谢谢。

1 个答案:

答案 0 :(得分:0)

事实证明,我使用的是Visual Studio的旧版本,结果整个事情与是否正在运行.net core完全混淆了。 升级到最新版本并确保安装了最新的.net内核,从而解决了我的大部分麻烦