HttpClient.PostAsync возвращает System.IO.Stream как свойство - PullRequest
0 голосов
/ 04 июня 2018

У меня есть какой-то устаревший код, с которым я пытаюсь работать, и мне нужно вернуть существующий объект, содержащий Stream из ApiController

public class LegacyObject
{
    public bool Result { get; set; }
    public Stream Stream { get; set; }       
}

Код API

public class BindJson : System.Web.Http.Filters.ActionFilterAttribute
{
    public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext)
    {
        string rawRequest;
        using (var stream = new StreamReader(actionContext.Request.Content.ReadAsStreamAsync().Result))
        {
            stream.BaseStream.Position = 0;
            rawRequest = stream.ReadToEnd();
        }
        rawRequest = rawRequest.ToString();
        var obj  = JsonConvert.DeserializeObject<LegacyParameters>(rawRequest.ToString());
        actionContext.ActionArguments["parameter"] = obj;                
     }

}
public class ReportsController : ApiController
{
    [BindJson]
    [HttpPost]
    public LegacyObject ReturnReport([FromBody]LegacyParameters parameter)
    {           
        LegacyObject r = LegacyClass.GetReportStream(parameters);
        return r; //Object properties are correctly set and no errors at this point
    }
}

Мой вызов к API:

using (var httpClient = new System.Net.Http.HttpClient())
{
    httpClient.BaseAddress = new Uri("http://myserver/");

    string contents = JsonConvert.SerializeObject(paramList);

    var response = httpClient.PostAsync("/api/ReturnReport", new StringContent(contents, Encoding.UTF8, "application/json")).Result;                                        

}

Я получаю 500 Внутренняя ошибка сервера на PostAsync, когда мой LegacyObject.Stream имеет содержимое,Это работает, когда содержимое потока равно нулю.Я работаю локально на своем ПК для разработки, и веб-сервер для API - IIS Express.

Буду признателен за любой совет.

1 Ответ

0 голосов
/ 04 июня 2018

Таким образом, чтобы получить более подробную информацию о Внутренней ошибке сервера 500, я добавил это в свои проекты WebApiConfig Регистрация

config.Services.Replace(typeof(IExceptionLogger), new UnhandledExceptionLogger());

С этим классом

public class UnhandledExceptionLogger : ExceptionLogger
{
    public override void Log(ExceptionLoggerContext context)
    {
        var log = context.Exception.ToString();
        //Write the exception to your logs
    }
}

Переменная журнала теперь дает мне детали, которые мне нужны для отладки

К вашему сведению - ошибка была тайм-аут чтения в моем потоке

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...