我已经创建了批量请求服务。此服务的目的是允许开发人员一次发送多个请求,然后为每个请求获取响应。这非常适合使用非缓存请求。 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;
}