批量请求服务

时间:2013-03-26 21:49:36

标签: servicestack

我已经创建了批量请求服务。此服务的目的是允许开发人员一次发送多个请求,然后为每个请求获取响应。这非常适合使用非缓存请求。 POST,PUT和DELETE适用于缓存的请求,因为这些操作会刷新缓存。 GET动词的响应返回ServiceStack.Common.Web.CompressedResult对象而不是相应类型的对象。

我的第一个问题是我是在重新发明轮子吗?是否有ServiceStack功能,我已经错过了吗?

如果没有,以下是我如何完成此操作的代码摘录。直接调用缓存服务(不使用批量请求对象)将返回相应的响应。感谢您对此事的任何见解。

    public override object OnPost(BulkRequest request)
    {
        var response = new BulkResponse();
        response.Responses = new System.Collections.Generic.List<object>();

        string url = this.Request.AbsoluteUri.Replace(this.Request.PathInfo, string.Empty);

        if (request.Requests == null)
        {
            response.Message.Add("The Requests property cannot be null.");
            response.Status = Contract.StatusType.Error;
            return response;
        }

        if (request.Verb == null)
        {
            response.Message.Add("The Verb property cannot be null.");
            response.Status = Contract.StatusType.Error;
            return response;
        }

        if (request.Verb.Count != request.Requests.Count && request.UseFirstVerbForAllRequests == false)
        {
            response.Message.Add("There must be a matching verb for each request.");
            response.Status = Contract.StatusType.Error;
            return response;
        }

        try
        {
            for (int i = 0; i < request.Requests.Count; i++)
            {
                string verb = request.UseFirstVerbForAllRequests ? request.Verb[0] : request.Verb[i];

                if (String.IsNullOrWhiteSpace(verb))
                {
                    verb = HttpMethods.Get;
                }

                var requestResponse = this.Query(request.Requests[i], verb);
                response.Responses.Add(requestResponse);
            }

            response.Status = Contract.StatusType.Successful;
        } 
        catch (Exception ex) 
        {
            response.Message = new System.Collections.Generic.List<string>();
            response.Message.Add(ex.Message);
        }

        return response;
    }

Query函数确定请求对象的类型并发出适当的请求。

    private object Query(Object request, string verb)
    {
        var type = request.GetType();
        object response = null;

        if (type == typeof(Contract.Activity.ActivityRequest))
        {
            var service = this.ResolveService<Service.Services.Activity.ActivityService>();
            response = (verb == HttpMethod.Post.ToString()) ? service.Post((Contract.Activity.ActivityRequest)request) :
                (verb == HttpMethod.Get.ToString()) ? service.Get((Contract.Activity.ActivityRequest)request) :
                (verb == HttpMethod.Put.ToString()) ? service.Put((Contract.Activity.ActivityRequest)request) :
                (verb == HttpMethod.Delete.ToString()) ? service.Delete((Contract.Activity.ActivityRequest)request) : null;
        }
        else if (type == typeof(Contract.Activity.CachedActivityRequest))
        {
            var service = this.ResolveService<Service.Services.Activity.CachedActivityService>();
            response = (verb == HttpMethod.Post.ToString()) ? service.Post((Contract.Activity.CachedActivityRequest)request) :
                (verb == HttpMethod.Get.ToString()) ? service.Get((Contract.Activity.CachedActivityRequest)request) :
                (verb == HttpMethod.Put.ToString()) ? service.Put((Contract.Activity.CachedActivityRequest)request) :
                (verb == HttpMethod.Delete.ToString()) ? service.Delete((Contract.Activity.CachedActivityRequest)request) : null;
        }
        ...
        return response;
    }

0 个答案:

没有答案