首页 > 解决方案 > HttpClient.PostAsync 返回 System.IO.Stream 作为属性

问题描述

我有一些我正在尝试使用的遗留代码,并且需要返回一个包含来自ApiController的Stream的现有对象

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;                                        

}

当我的 LegacyObject.Stream 有内容时,我在 PostAsync 上收到500 Internal Server Error 。它在流内容为空时起作用。我在我的开发 PC 上本地工作,API 的 Web 服务器是 IIS Express。

任何意见,将不胜感激。

标签: c#asp.net-web-api

解决方案


因此,为了获得有关 500 Internal Server Error 的更多详细信息,我将其添加到我的项目WebApiConfig Register

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
    }
}

日志变量现在为我提供了我需要调试的详细信息

仅供参考 - 错误是我的 Stream 上的读取超时


推荐阅读