Передача объекта исключения в параметр API в .NET Core

#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"));