Я пытаюсь создать базовый тестовый веб-интерфейс и использовать стандартный контроллер для его тестирования.
Когда я запускаю его, положив
http://localhost:55144/home/testapi
он запустит функцию catcher и полностью проигнорирует параметр.
Затем перехватчик с радостью вернет значение, которое можно увидеть в коде вызова.
Я пробовал различные комбинации помещения [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; }
}
Домашний контроллер, вызывающий 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;
}
}
}
Скажите, пожалуйста, что я делаю не так с моим кодом, как это исправить и что происходит, когда код не попадает в ловушку?
Спасибо.