[英]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.