【问题标题】:ASP.NET MVC Web API : Posting a list of objectsASP.NET MVC Web API:发布对象列表
【发布时间】:2014-01-18 16:54:48
【问题描述】:

我正在尝试将我的 winforms 应用程序中的对象列表发布到我的 asp.net mvc 4 网站。我已经测试过发布一个对象,它可以工作,但不适用于列表。它返回一个500 (Internal Server Error)。这是我的代码:

ASP.NET MVC Web API

public class PostTraceController : ApiController
{
    public HttpResponseMessage Post(List<WebTrace> list)
    {
        try
        {
            // Some code
            return Request.CreateResponse(HttpStatusCode.Created);
        }
        catch (Exception ex)
        {
            HttpContext.Current.Trace.Write("exception", ex.Message);
            return Request.CreateErrorResponse(HttpStatusCode.ServiceUnavailable, ex);
        }
    }

    public HttpResponseMessage Post(WebTrace item)
    {
        try
        {
            // Some code
            return Request.CreateResponse(HttpStatusCode.Created);
        }
        catch (Exception ex)
        {
            HttpContext.Current.Trace.Write("exception", ex.Message);
            return Request.CreateErrorResponse(HttpStatusCode.ServiceUnavailable, ex);
        }
    }
}

Win 表单应用程序

public class BaseSender
{
    public BaseSender()
    {
        Client = new HttpClient
        {
            BaseAddress = new Uri(@"http://localhost/mywebsite/")
        };

        Client.DefaultRequestHeaders.Accept.Add(
            new MediaTypeWithQualityHeaderValue("application/json"));
    }

    public string UserCode { get; set; }
    protected readonly HttpClient Client;

    public HttpResponseMessage PostAsJsonAsync(string requestUri, object value)
    {
        var response = Client.PostAsJsonAsync(requestUri, value).Result;
        response.EnsureSuccessStatusCode();
        return response;
    }
}

public class WebTraceSender : BaseSender
{
    private const string requestUri = "api/posttrace";

    public bool Post(List<ArchiveCptTrace> list)
    {
        try
        {
            var listWebTrace = new List<WebTrace>();
            foreach (var item in list)
            {
                listWebTrace.Add(new WebTrace
                    {
                        DateStart = item.DatePreparation,
                        DateEnd = item.DateCloture,
                        UserStart = item.UserPreparation.UserName,
                        UserEnd = item.UserCloture.UserName,
                        AmountStart = item.MontantPreparation,
                        AmountEnd = item.MontantCloture,
                        TheoricAmountEnd = item.MontantTheorique,
                        Difference = item.Ecart,
                        UserCode = UserCode
                    });
            }

            var responce = PostAsJsonAsync(requestUri, listWebTrace);
            return responce.IsSuccessStatusCode;
        }
        catch (Exception e)
        {
            // TODO : Trace the exception
            return false;
        }
    }
}

编辑:

我发现了错误的场景,即我的 api 控制器中有两个方法,即使它们具有不同的签名。如果我评论一种方法,则帖子工作正常(项目或列表)。有什么想法吗?

【问题讨论】:

  • 您是否在 500 响应中看到错误消息。如果是这样,你能分享一下它是什么吗?
  • @KiranChalla :不,很遗憾没有消息,即使在跟踪页面 (localhost/mywebsite/trace.axd) 中也是如此

标签: asp.net-mvc json winforms asp.net-web-api http-post


【解决方案1】:

这些方法可能有不同的签名,但 Web API 在不检查主体的情况下无法区分它们,出于性能原因它不会这样做。

您可以做两件事 - 创建一个仅包含 WebTrace 对象列表的新类,并将其放入不同的 API 控制器中,或者您可以将自定义路由映射到现有方法之一。您可以使用ActionName 属性来做到这一点,但是,我可能会采用第一种方法。

【讨论】:

  • +1 对于解释,您的回答非常有帮助。尽管第一种方法看起来很诱人,但出于可维护性的原因,我选择使用路由方法,更具体地说,属性路由 (asp.net/web-api/overview/web-api-routing-and-actions/…)。再次感谢:-)
  • 是属性路由是现在要走的路,而不是 ActionName 属性。谢谢,我会更新答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-06
  • 2013-02-06
  • 1970-01-01
  • 1970-01-01
  • 2013-02-23
  • 2015-12-04
  • 1970-01-01
相关资源
最近更新 更多