#c# #asp.net-mvc #asp.net-web-api #asp.net-web-api2
#c# #asp.net-mvc #asp.net-web-api #asp.net-web-api2
Вопрос:
Из ASP.NET Приложение MVC, я делаю запрос POST к действию в моем веб-API. Действие в API выполняется успешно. Когда я делаю тот же запрос в клиенте REST, таком как Postman для Chrome, я вижу действительный ответ Json.
Однако, если я выполняю вызов из своего приложения MVC, я не вижу никакого ответа, и поток управления исчезает после отправки запроса POST в API. Приложение MVC продолжает ждать, как будто.
Вот мой код.
Веб-API
[HttpPost]
[ActionName("CreateNewUserFromAccountInfo")]
public IUser CreateNew(NewUserAccountInfo newUserAccountInfo)
{
return _provider.CreateNew(newUserAccountInfo.FullName, newUserAccountInfo.Email, newUserAccountInfo.PasswordHash);
}
Контроллер приложения MVC
IUser user = new WebAPIClient()
.PostAsJsonAsync<NewUserAccountInfo, IUser>
("api/membership/CreateNewUserFromAccountInfo",
newUserAccountInfo
).Resu<
Из WebAPIClient
класса из библиотеки классов, на которую ссылается приложение MVC:
public async Task<R> PostAsJsonAsync<T, R>(string uri, T value)
{
using (var client = new HttpClient())
{
client.BaseAddress = new Uri(_baseUri);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
await PrintRequestBodyToDebugWindowAsync(value, new JsonMediaTypeFormatter());
// The flow of control just disappears after this line
// and never gets to the next line
var response = await client.PostAsJsonAsync(uri, value);
// The flow of control never gets here
if (response.IsSuccessStatusCode) return await response.Content.ReadAsAsync<R>();
else return default(R);
}
}
РЕЗУЛЬТАТЫ ВОЗВРАЩАЮТСЯ ПРИ ЗАПРОСЕ, СДЕЛАННОМ ЧЕРЕЗ POSTMAN (клиент REST)
Request Uri: http://localhost:54488/api/membership/CreateNewUserFromAccountInfo
Method: POST
Request Body: {"FullName":"Aamir Khan","Email":"aamir@khan.com","PasswordHash":"hello"}
Response:
{
"Id": 15,
"IsExternal": false,
"ExternalId": null,
"ExternalProviderName": null,
"UserType": "Healthcare Seeker",
"Verified": false,
"VerificationCode": "375b8d2f-67df-433d-9e95-c84c30462b80",
"VerificationCodeExpiresOn": "9999-12-31T23:59:59.9999999",
"PasswordResetCode": null,
"DefaultPasswordChanged": false,
"HasFilledBasicProfile": false,
"CreationDateTime": "2014-07-01T20:47:45.1405416 05:30",
"FullName": {
"Id": 2,
"Name": "FullName",
"Value": "Aamir Khan",
"Description": null,
"PrivacyLevel": {
"Id": 1,
"Name": "Private",
"Description": "Visible only to me"
}
},
"Email": {
"Id": 1,
"Name": "Email",
"Value": "aamir@khan.com",
"Description": null,
"PrivacyLevel": {
"Id": 1,
"Name": "Private",
"Description": "Visible only to me"
}
},
"Profiles": [
null,
null,
null
],
"BasicProfile": null,
"MedicalProfile": null,
"EmergencyProfile": null
}
Комментарии:
1. Вы пробовали использовать Fiddler для проверки вашего HTTP-запроса?
2. @tia: Да? Я только что опубликовал ответ, который получил от Почтальона. Какой смысл делать это снова в Fiddler?
3. @WaterCoolerv2: Это помогло бы вам узнать, отправляет ли браузер запрос, и должен ли браузер получать тот же ответ, который вы получаете через Postman.
4. @StriplingWarrior: Это запрос POST. Я не уверен, как бы вы отправили его через браузер?
5. @WaterCoolerv2: Ах, это немного проясняет ситуацию. К вашему сведению, отправить HTTP-сообщение из браузера не сложно. Независимо от того, если вы используете Fiddler, вы должны иметь возможность сравнивать то, что отправляет и получает приложение MVC, с тем, что отправляет и получает Postman.