簡體   English   中英

ServiceStack JsonServiceClient使用路由屬性發送會引發未找到異常

[英]ServiceStack JsonServiceClient Send using route attributes throws exception not found

我正在嘗試使用servicestack進行簡單的api post調用,並且不斷拋出“未找到”異常。 當使用Web瀏覽器rest api(例如郵遞員)直接對api進行相同的post調用時,該api調用就起作用了。

我已經用route屬性裝飾了我的請求對象

[Route("/register", "POST")]
public class Register : IReturn<RegistrationResponse>
{
    public DateTime? BirthDate { get; set; }

    public string Continue { get; set; }

    public string Email { get; set; }

    public string FirstName { get; set; }

    public string LastName { get; set; }

    public string Gender { get; set; }

    public string Password { get; set; }
}

JsonServiceClient已使用基本uri初始化,但以下調用失敗

_client = new JsonServiceClient(_apiUri);
_client.HttpMethod = HttpMethods.Post;
var response = _client.Send(body);

我捕獲的異常是:

$ Exception {“ Not Found”} System.Exception {ServiceStack.ServiceClient.Web.WebServiceException}在ServiceStack.ServiceClient.Web.ServiceClientBase.ThrowWebServiceException [TResponse](Exception ex,String requestUri)在ServiceStack.ServiceClient.Web.ServiceClientBase.ThrowResponseTypeException ServiceStack上的[TResponse](對象請求,異常,字符串requestUri)。ServiceStack上的[TResponse](對象請求,異常,字符串requestUri,函數1 createWebRequest, Func函數2的getResponse,TResponse&response)。 ApiService.cs:第81行中ApiService`2.Post(字符串路徑,TParams主體)的ServiceClient.Web.ServiceClientBase.Send [TResponse](對象請求)

servicestack上有關新API的文檔提到了裝飾請求DTO的Route屬性的使用以及IReturn的使用,但是通過查看Send方法背后的代碼,它正在從請求名稱中得出剩余的api url。 ,這意味着您的請求dto不能命名為其他任何東西。

public virtual TResponse Send<TResponse>(object request)
{
    var requestUri = this.SyncReplyBaseUri.WithTrailingSlash() + request.GetType().Name;
    var client = SendRequest(requestUri, request);

    try
    {
        var webResponse = client.GetResponse();
        return HandleResponse<TResponse>(webResponse);
    }
    catch (Exception ex)
    {
        TResponse response;

        if (!HandleResponseException(ex,
            request,
            requestUri,
            () => SendRequest(HttpMethods.Post, requestUri, request),
            c => c.GetResponse(),
            out response))
        {
            throw;
        }

        return response;
    }
}

是什么導致“未找到”異常?

您的Register類中的所有內容看起來都是正確的。

對於您的客戶電話,我將其更改為

_client = new JsonServiceClient(_apiUri);
_client.Post(new Register()); //assuming you can map your 'body' variable to a Register class

只是為了丟失多余的代碼行。

它正在根據請求的名稱計算出剩余的api網址,這意味着您的請求dto不能命名為其他任何名稱。

正在計算其余api將命中的端點。 一旦到達端點,ServiceStack的內部組件應基於Operation(在本例中為Register)和Http方法處理路由。 基本上,它將嘗試查找以請求對象(寄存器)為參數的Service類(繼承Service標記接口的任何類),並將Http方法用作“函數”進行調用。

是什么導致“未找到”異常?

對此不確定。 如果您可以提供“服務”類,則可能會有所幫助。

如果您有類似的服務類

public class RegisterService : Service
{
    public RegistrationResponse Post(Register request) 
    {
        //service code 
        return new RegistrationResponse();
    }
}

路由應該工作。

解決此問題的方法是確保在api上啟用了用於預定義路由的servicestack功能。 完成此操作后,您無需費心請求對象上的Route屬性。

現在,端點主機配置如下所示:

new EndpointHostConfig
{
    DefaultContentType = ContentType.Json,
    EnableFeatures = Feature.None
                            .Add(Feature.Json)
                            .Add(Feature.PredefinedRoutes),
    GlobalResponseHeaders = new Dictionary<string, string>(),
    DefaultRedirectPath = "/documentation"
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM