【问题标题】:C# ApiController returns List but postman shows "Could not get any response"C# ApiController 返回列表但邮递员显示“无法得到任何响应”
【发布时间】:2018-01-22 09:45:33
【问题描述】:

我正在与奇怪的情况作斗争。我正在从 postMan 向 ApiController 调用 void 方法,但得到了奇怪的结果。 ApiController 捕获请求并返回带有 3 个对象的结果,但邮递员以某种方式显示无法获得任何响应。虽然所有其他返回一个值的方法都可以正常工作,但问题却是返回多个对象。

ApiController:

[HttpGet]
[Route("api/documents/AllDocs/")]
public List<Document> AllDocs()
{
    lock (_lock)
    {
        _documentsRepository = DocumentsRepository.Instance;
        var result = _documentsRepository.GetDocuments();

        return result;
    }
}

文档存储库:

public List<Document> GetDocuments()
{
    var documents = new List<Document>();
    try
    {
        var db = new Context();
        var docs = db.Document;
            //.Include(x => x.DocumentItems)
            //.Include(x => x.Page.Select(y => y.RegionCropper.Select(z => z.Cropper)))
            //.Include(x => x.Page.Select(y => y.RegionCropper.Select(z => z.MinorCropper))).ToList();
        return docs.ToList();
    }
    catch (Exception ex)
    {
        return documents;
    }
}

邮递员:

网络配置:

public static class WebApiConfig
{
    private static HttpSelfHostServer _server;

    public static void Run(string port)
    {
        var config = new HttpSelfHostConfiguration($"http://localhost:{port}");//"http://localhost:8080");

        config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();

        config.Routes.MapHttpRoute(
        name: "API Default",
        routeTemplate: "api/{controller}/{action}/{id}",
        defaults: new { id = RouteParameter.Optional });

        //config.Routes.MapHttpRoute(
        //    "newdocument", "api/documents/newdocument/{document}",new { document = RouteParameter.Optional });


        config.MaxReceivedMessageSize = int.MaxValue;;
        config.MaxBufferSize = int.MaxValue;
        _server = new HttpSelfHostServer(config);
        _server.OpenAsync();

    }

    public static void Stop()
    {
        _server?.CloseAsync();
    }
}

【问题讨论】:

  • 你试过没有最后一个斜线[Route("api/documents/AllDocs")] 吗?
  • @rene 它与斜线无关,因为方法被调用并返回值。
  • 这是什么ApiController?您是否尝试过返回 ActionResult?
  • @Alex 我添加了 webconfig。不,我没有,但是返回一个对象的其他方法可以正常工作,因此该方法也应如此。那么为什么要改变返回类型呢?
  • @Chris 一切都在邮递员的本地机器上,除了这个之外的每个方法都根据需要返回,但问题是这样的,然后它 api 返回结果多个对象。标题中解释的所有内容请先阅读。

标签: c# request httpclient asp.net-apicontroller


【解决方案1】:

这是在黑暗中的一个镜头,但我最近遇到了同样的问题。

我的 JSON-Config 有问题。

在我的模型中,我有一个类User,其列表为Postings

public class User
{
    public long Id { get; set; }
    public string UserName { get; set; }
    public string Password { get; set; }
    public List<Posting> Postings{ get; set; }
}

这些帖子的模型如下所示:

public class Posting
{
    public long Id { get; set; }
    public double Value { get; set; }
    public string Name { get; set; }
    public DateTime PostingDate { get; set; }
    public virtual User User { get; set; }
}

每当我返回一个List&lt;Posting&gt;邮递员说无法得到任何回应。

这里的问题是 Json 序列化。在尝试序列化我的模型时,Json 遇到了自引用循环,但没有引发异常。

要摆脱这种情况,我唯一要做的就是在我的发布模型中将 [] 添加到用户:

[JsonIgnore] 
public virtual User User { get; set; }

当我尝试以编程方式序列化 List 时,我重新考虑了这一点,因为这样会引发异常。

【讨论】:

  • 但是如何序列化它以将孩子返回给客户端,而不是仅仅切割孩子的数据?
  • 我不确定我的问题是否正确,但如果您正在序列化用户对象并包含帖子,则没有数据剪切。
猜你喜欢
  • 2020-09-20
  • 2019-07-18
  • 2017-11-18
  • 2019-03-20
  • 2019-04-01
  • 1970-01-01
  • 2018-06-03
  • 2018-09-24
  • 2019-12-23
相关资源
最近更新 更多