#c# #asp.net-web-api2 #asp.net-core-webapi
#c# #asp.net-web-api2 #asp.net-core-webapi
Вопрос:
Я работаю над протоколированием исключений, я создал API для этого, API, принимающий исключение в качестве параметра, и еще кое-что.
[HttpPost]
[Route("/Log")]
public IEnumerable<string> Post([FromBody] WP2Exceptions wp2Exceptions)
{
ExceptionsModel exceptionsModel = new ExceptionsModel();
exceptionsModel = _exceptions.GetExceptionsByType(wp2Exceptions.exception.GetType().ToString());
ExceptionsLogModel exceptionLogModel = new ExceptionsLogModel();
exceptionLogModel.ExceptionID = exceptionsModel.ExceptionID;
exceptionLogModel.ModuleName = System.Reflection.Assembly.GetEntryAssembly().GetName().Name;
exceptionLogModel.ExceptionMessage = wp2Exceptions.exception.Message;
exceptionLogModel.ExceptionType = wp2Exceptions.exception.GetType().ToString();
exceptionLogModel.ExceptionSource = wp2Exceptions.exception.Source.ToString();
exceptionLogModel.ExceptionUrl = wp2Exceptions.exception.StackTrace;
_exceptionsLog.AddExceptionsLog(exceptionLogModel);
return new string[] { exceptionsModel.ExceptionType, exceptionsModel.Message };
}
public class WP2Exceptions
{
public string moduleName { get; set; }
public Exception exception { get; set; }
}
Пока я передаю исключение в параметр, я получаю ошибку «Неверный запрос»
Тестовый код
public async void callAPI()
{
HttpClient client = new HttpClient();
client.BaseAddress = new Uri("http://localhost:50558/");
try
{
string s = null;
string sp = s.ToString();
}
catch (Exception ex)
{
var mydata = "{'exception':'" JsonConvert.SerializeObject(ex) "','moduleName':'WEBAPI'}";
var response = await client.PostAsync("Log", new StringContent(mydata, Encoding.UTF8, "application/json"));
if (response != null)
{
Console.WriteLine("Log ID - " response.ToString());
}
}
}
Пожалуйста, поправьте меня, где я делаю неправильно, или возможно ли передать объект исключения в качестве параметра ВЕБ-API?
Комментарии:
1. Вы можете отправить любой объект на HTTP enpoint, если вы сериализуете его, например, в JSON или XML или даже обычный текст. Однако вместо объединения строк вы можете просто создать
mydata
объект с нужными вам свойствами и сериализовать его. Вы могли бы использовать анонимный тип, напримерvar myData=new {exception=ex,moduleName="WebApi"}; var str=JsonConvert.SeriqalizeObject(myData);
2.
Bad Request
возвращается, если запрос действительно плохой, например, из-за неподходящего заголовка. Используйте Fiddler или другой отладочный прокси, чтобы увидеть, что на самом деле отправляется на сервер. Возможно, объединение строк привело к недопустимой строке JSON. Одинарной кавычки в сообщении об исключении или объявления универсального типа будет достаточно, чтобы создать недопустимую строку3. @pangaiotis не работает. все та же проблема, ожидание клиента. PostAsync(«Log», новый StringContent(JsonConvert.SerializeObject(mydata), кодировка. UTF8, «application / json»));
4. Потому что неправильный запрос не вызван содержимым. Это еще одна проблема, например, неправильный заголовок. Однако используемая вами конкатенация строк усложняет и допускает появление еще большего количества ошибок. Вы использовали Fiddler? Как выглядел запрос? Как выглядело сериализованное исключение? Возможно, он был слишком большим? Можете ли вы опубликовать другой объект?
Ответ №1:
Я решаю проблему,
В удалите приведенный ниже код.
var mydata = "{'exception':'" JsonConvert.SerializeObject(ex) "','moduleName':'WEBAPI'}";
Создал новый класс и передал данные .
public class paramObject
{
public string modulename { get; set; }
public Exception exception { get; set; }
}
Внутри метода callAPI я реализую следующий код.
pramObject po = new pramObject()
{
modulename="Webapi",
exception=ex,
};
var response = await client.PostAsync("Log", new StringContent(JsonConvert.SerializeObject(po), Encoding.UTF8, "application/json"));