ASP.NET MVC Web API:发布对象列表

时间:2014-01-18 16:54:49

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

我正在尝试将我的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);
        }
    }
}

赢取表单应用

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控制器中有两个方法,甚至认为它们有不同的签名。如果我评论一个方法,帖子工作正常(项目或列表)。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

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

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