【发布时间】: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