在ServiceStack中使用IRestClient发出HEAD请求

本文关键字:发出 HEAD 请求 IRestClient ServiceStack | 更新日期: 2023-09-27 17:49:45

上下文:我已经构建了一个REST服务来处理'Profile'对象。每个配置文件都需要有一个唯一的名称。出于验证目的,客户端需要执行的操作之一是检查以确保具有给定名称的概要文件不存在。

与其构建rpc风格的'ProfileExists'方法,我更愿意遵循REST设计原则,并使用给定的名称向Profile发出HEAD请求,然后根据Profile是否已经存在(分别为200,404)返回适当的响应代码,不需要响应体。

按照新的ServiceStack API的约定,我设置了一个方法来接受Head请求,并使用Fiddler成功地测试了这两种情况:

public object Head(GetProfile request)
{
    ValidateRequest(request);
    HttpStatusCode responseCode;
    using (var scope = new UnitOfWorkScope())
    {
        responseCode = _profileService.ProfileExists(request.Name) ? HttpStatusCode.OK : HttpStatusCode.NotFound;
        scope.Commit();
    }
    return new HttpResult { StatusCode = responseCode };
}

问题出在客户端。通过ServiceStack的IRestClient接口发出HEAD请求被证明是困难的。虽然有Get、Post、Put和Delete的方法,但没有Head的方法。从这里开始,我假设可以使用CustomMethod显式地指定HEAD动词作为参数:

public bool ProfileExists(string profileName)
{
    try
    {
        var response = _restClient.CustomMethod<IHttpResult>(HttpMethods.Head, new GetProfile { Name = profileName });
        return response.StatusCode == HttpStatusCode.OK;
    }
    catch (WebServiceException ex)
    {
        if (ex.StatusCode == 404)
            return false;
    }
    // Return false for any other reason right now.
    return false;
}

然而,底层实现(ServiceClientBase)在验证HttpVerb参数时抛出异常:

if (HttpMethods.AllVerbs.Contains(httpVerb.ToUpper()))
                throw new NotSupportedException("Unknown HTTP Method is not supported: " + httpVerb);

设置HttpMethods。AllVerbs包含RFC 2616及更多常用动词。除非这种行为是一个bug,否则为任何已知的HTTP动词抛出异常表明作者对CustomMethod的意图不包括能够为已知的HTTP动词发出请求。

这就引出了我的问题:我如何在ServiceStack的客户端发出HEAD请求?

在ServiceStack中使用IRestClient发出HEAD请求

这是一个bug:

if (HttpMethods.AllVerbs.Contains(httpVerb.ToUpper()))
    throw new NotSupportedException("Unknown HTTP Method is not supported: " + httpVerb);

我刚刚在这个提交中修复了。此修复将在本周末发布的ServiceStack (v3.9.33+)的下一个版本中提供。