【问题标题】:ServiceStack request hit service twiceServiceStack 请求命中服务两次
【发布时间】:2013-10-28 13:50:42
【问题描述】:

我有这样一个简单的服务:

[Route("/Message/{Folder}", "GET")]
public class MessageList : IReturn<List<Message>>
{
    public string Folder { get; set; }
}

public class MessageListService : Service
{
    private readonly IDatabase _database;
    public MessageListService(IDatabase database)
    {
        _database = database;
    }

    public List<Message> Get(MessageList request)
    {
        return _database.Fetch<Message>(
        "EXEC GetMessage @@Folder=@1", request.Folder);
     }

我这样称呼它:

     http://localhost/Message/Inbox

不知何故,该服务被击中了两次:第一次是正确的请求,然后是未定义的 request.Folder。奇怪的是,即使第二次调用也不返回任何数据,框架总是从第一次调用返回正确的结果。所以我从来没有注意到这一点,直到碰巧运行了一个 SQL 分析器。

我无法弄清楚导致重试的确切原因。我认为这可能与数据有关,因为如果我通过我的剃须刀 UI 调用 Inbox,它不会重复。如果我打电话给存档,那就可以了。但是,如果我使用像 XYZ 这样不返回数据的随机参数调用,它也会重复调用。

但是,如果我这样调用服务:

  http://localhost/Message/Inbox?format=json

然后它总是两次服务,一次有效,一次没有输入参数。但是 Json 结果似乎总是正确的。第二个无效调用刚刚命中数据库然后消失了。

真的需要一些帮助。知道发生了什么吗?

【问题讨论】:

  • 将其缩小到 8 条记录。如果这 8 个从数据库返回,则服务在请求中第二次命中 null 参数。但无法进一步指出。这些结果中有 Html 标签,不确定是否重要。但我无法理解的是数据结果如何导致请求/服务自行重试。

标签: request servicestack


【解决方案1】:

ServiceStack 不会调用自身,如果服务被调用两次,则很可能是客户端在调用它。使用 Fiddler 或 WebInspector 找出真正发生的事情。例如,如果您使用的是 Ajax 客户端,那么浏览器可能会发出单独的 OPTIONS 请求,在这种情况下您可以short-circuit all OPTIONS request with a Global Request filter

【讨论】:

  • 我认为通过使用 format=json 我已经消除了所有客户端代码。结果我的浏览器中的书签扩展程序拦截了页面中的某些组合并自行ping回服务器。那一天真是浪费了!非常感谢您的帮助。这个框架太棒了,我放弃了6个多月的工作试图切换,因此压力和所有愚蠢^_^
  • 哎哟重写总是有风险的,而且没有什么乐趣 - 希望它成功!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-15
  • 1970-01-01
  • 1970-01-01
  • 2022-01-12
相关资源
最近更新 更多