1

servicestackを使用して単純なAPIpost呼び出しを行おうとしていますが、「notfound」という例外がスローされ続けます。同じpost呼び出しがWebブラウザのRESTAPI(postmanなど)を使用してAPIに直接行われる場合、api呼び出しは機能します。

リクエストオブジェクトをルート属性で装飾しました

[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} at ServiceStack.ServiceClient.Web.ServiceClientBase.ThrowWebServiceException [TResponse](Exception ex、String requestUri)at ServiceStack.ServiceClient.Web.ServiceClientBase.ThrowResponseTypeException [TResponse](Object request、Exception ex、String requestUri)at ServiceStack.ServiceClient.Web.ServiceClientBase.HandleResponseException [TResponse](Exception ex、Object request、String requestUri、Func 1 createWebRequest, Func2 getResponse、TResponse&response)atServiceStack.ServiceClient.Web。 ApiService.cs:line 81のApiService`2.Post(String path、TParams body)でのServiceClientBase.Send [TResponse](Object request)

servicestackの新しいAPIに関するドキュメントには、リクエストDTOを装飾するRoute属性の使用と、IReturnの使用が記載されていますが、Sendメソッドの背後にあるコードを見ると、リクエストの名前から残りのAPIURLが計算されています。 、これは、リクエスト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例外の原因は何ですか?

4

2 に答える 2

1

Registerクラスのすべてが正しく見えます。

あなたのクライアントコールのために私はそれをに変更します

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

余分なコード行を失うだけです。

リクエストの名前から残りのAPIURLを処理しています。これは、リクエストのdtoに別の名前を付けることができないことを意味します。

残りのAPIがヒットするエンドポイントを処理しています。エンドポイントに到達すると、ServiceStackの内部は、操作(この場合はRegister)とHttpメソッドに基づいてルーティングを処理する必要があります。基本的には、リクエストオブジェクト(Register)をパラメータとして持つServiceクラス(Serviceマーカーインターフェイスを継承するクラス)を見つけようとし、呼び出す'関数'としてHttpメソッドを使用します。

Not Found例外の原因は何ですか?

これについては正確にはわかりません。'Service'クラスを提供できれば役立つかもしれません。

次のようなサービスクラスがある場合

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

ルーティングは機能するはずです。

于 2013-03-25T16:03:52.067 に答える
0

これに対する修正は、事前定義されたルートのサービススタック機能がAPIで有効になっていることを確認することでした。これが完了すると、リクエストオブジェクトのRoute属性を気にする必要はありません。

エンドポイントのホスト構成は次のようになります。

new EndpointHostConfig
{
    DefaultContentType = ContentType.Json,
    EnableFeatures = Feature.None
                            .Add(Feature.Json)
                            .Add(Feature.PredefinedRoutes),
    GlobalResponseHeaders = new Dictionary<string, string>(),
    DefaultRedirectPath = "/documentation"
}
于 2013-03-25T15:31:47.987 に答える