2013-03-25 19 views
1

我正在嘗試使用servicestack進行簡單的api post調用,並且它一直拋出異常「未找到」。當使用web瀏覽器休息api直接對api進行相同的郵寄呼叫時,郵遞員,api電話工程。ServiceStack JsonServiceClient使用路由屬性發送拋出異常未找到

我裝飾了我的請求對象與路由屬性

[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.ServiceCl ient.Web.WebServiceException}在 ServiceStack.ServiceClient.Web.ServiceClientBase.ThrowWebServiceException [τ響應](例外 前,字符串requestUri)在 ServiceStack.ServiceClient.Web.ServiceClientBase.ThrowResponseTypeException [τ響應(對象 請求,異常前,串requestUri)在 ServiceStack.ServiceClient.Web.ServiceClientBase.HandleResponseException [τ響應](例外 前,對象請求,串requestUri,函數功能 GETRESPONSE,τ響應&響應)在 ServiceStack.ServiceClient.Web.ServiceClientBase.Send [ TResponse](Object request)at ApiService`2.Post(String path,TPa頂杆體)在 ApiService.cs:線81

上在servicestack新的API的文檔中提到使用路由的屬性裝飾請求DTO和使用IReturn的而是從看後面的代碼發送方法,它是從請求的名稱中找出剩餘的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; 
    } 
} 

什麼導致Not Found異常?

回答

0

修復此問題是爲了確保api上啓用了預定義路由的servicestack功能。完成此操作後,您無需打擾請求對象上的Route屬性。

終點主機配置現在看起來是這樣的:

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

僅供參考 - PredefinedRoutes應該默認啓用,如此處所述(https://github.com/ServiceStack/ServiceStack/wiki/Plugins#list-of-plugins-added-by-default) – paaschpa 2013-03-25 16:22:27

1

寄託都在你的註冊類看起來是正確的。

爲您的客戶撥打我會把它變成

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

只是失去額外的代碼行。

它正在從請求的名稱中找出其餘的api url,這意味着您的請求dto不能被命名爲任何不同的名稱。

它正在制定出其餘api將要達到的終點。一旦它到達端點,ServiceStack的內部應該根據操作(在這種情況下是Register)和Http方法來處理路由。基本上,它將嘗試找到一個Service類(任何繼承Service標記接口的類),它具有請求對象(Register)作爲參數,它將使用Http方法作爲「函數」來調用。

什麼導致Not Found異常?

不完全確定這一點。如果你可以提供你的'服務'類,它可能會有所幫助。

如果你有一個服務類像

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

路由應該工作。

相關問題