5

次のようなURLからRESTサービスを呼び出そうとしています。

example.org/account/someusername

要求と応答のDTOを定義しました。

[Route("/account/{UserName}", "GET")]
public class AccountRequest : IReturn<AccountResponse>
{
    public string UserName { get; set; }
}

public class AccountResponse
{
    public int Id { get; set; }
    public string UserName { get; set; }
    public string Bio { get; set; }
}

サービスの呼び出し:

JsonServiceClient client = new JsonServiceClient("http://example.org");
AccountRequest request = new AccountRequest { UserName = "me" };

AccountResponse response = client.Get(request); 

ただし、クライアントでGetを呼び出すと、ルートが尊重されません。デバッガーでクライアントインスタンスを確認すると、AsyncOneWayBaseUriの値はexample.org/json/asynconeway/です。この部分は、リクエストがこのURLに送信されることを意味するものではないため、関係ありません。実際、どこにリクエストを送信するのかわかりません。エラーは発生せず、応答オブジェクトのすべてのプロパティがnullです。

ここで何が欠けていますか?

4

4 に答える 4

8

サードパーティのREST/HTTPAPIを使用する

ServiceStackのサービスクライアントは、ServiceStackの事前定義されたルート、組み込みのAuth、自動ルート生成、組み込みのエラー処理などをサポートしているため、ServiceStackWebサービスを呼び出すと考えられています。

サードパーティのREST/HTTP Apiを呼び出すには、ServiceStack.Textに付属のHTTP Utilsを使用できます。これにより、.NETのHttpWebRequest周辺の一般的なデータアクセスパターンに簡潔で読みやすいAPIが提供されます。

List<GithubRepo> repos = "https://api.github.com/users/{0}/repos".Fmt(user)
    .GetJsonFromUrl()
    .FromJson<List<GithubRepo>>();

C#.NETサービスクライアントでServiceStackサービスを利用する

報告された動作が表示されません。クライアントで最新バージョンのServiceStackを使用していますか?

(サービス呼び出しを行わずに)使用される生成されたURLをテストする1つの方法は、TRequest.ToUrl(method)拡張メソッド(サービスクライアントが使用する)を直接呼び出すことです。

AccountRequest request = new AccountRequest { UserName = "me" };
request.ToUrl("GET").Print(); //  /account/me

を介して呼び出しようとしたときに、同じ自動生成ルートが使用されましたJsonServiceClient。例:

var client = new JsonServiceClient("http://example.org");
var response = client.Get(request); //calls http://example.org/account/me

ServiceStackのサービスクライアントで使用されるルートURL

ServiceStackは、呼び出し元のDTOおよびHTTPメソッドに入力された値と一致する最も適切なルートを使用しようとします。一致するルートがない場合は、事前定義されたルートにフォールバックします。

デフォルトでは、元の事前定義されたルートが使用されます。

/api/[xml|json|html|jsv|csv]/[syncreply|asynconeway]/[servicename]

/replyただし、ServiceStackは、およびの短いエイリアスもサポートするようになりました/oneway。例:

/api/[xml|json|html|jsv|csv]/[reply|oneway]/[servicename]

フラグを設定することにより、クライアントで使用するためにオプトインできます。

client.UseNewPredefinedRoutes = true;
于 2013-03-26T23:34:26.490 に答える
1

Servicestackは、JSON、XML、JSV、CSVなどのさまざまなデータ形式をサポートし、このデータにすぐにアクセスするためのさまざまなエンドポイントをサポートします。SSドキュメントのフォーマットセクションから取得した、サポートされているエンドポイントの詳細を以下に示します。

ServiceStackによって提供されるクライアントは、データにアクセスするためにRESTfulエンドポイントではなく、デフォルトのエンドポイントを使用します。データは引き続きRESTfulにアクセスできます。ブラウザでRESTfulURLに移動することで、これをテストできます。

Restfulエンドポイント

?format={format}URLの末尾に追加することで、使用する形式を定義できます。

  • ?format=json
  • ?format=xml
  • ?format=jsv
  • ?format=csv
  • ?format=htm

例:http://www.servicestack.net/ServiceStack.Hello/servicestack/hello/World!?format=json

あるいは、ServiceStackは、Accepthttpヘッダーで使用する必要がある形式も認識します。

  • Accept: application/json
  • Accept: application/xml

ご覧のとおり、このアプローチはとでのみ機能しjsonますxml

デフォルトのエンドポイント

/servicestack/[xml|json|html|jsv|csv]/[syncreply|asynconeway]/[servicename]

例:

  • / servicestack / xml / [syncreply | asynconeway]/[servicename]はXMLになります
  • / servicestack / json / [syncreply | asynconeway]/[servicename]はJSONになります

SOAPエンドポイント

もちろん、SOAPエンドポイントはXMLのみをサポートします。


アップデート

ServiceStackクライアントは、ServiceStackに固有の動作に依存しているため、ServiceStack以外のWebサービスへの接続には使用できません。RestSharpのようなもの、または安らかなWebサービスとの対話を可能にする他の多くの利用可能なクライアントの1つを使用するのがおそらく最善です。

于 2013-03-26T21:36:48.953 に答える
1

ルートを尊重しません

404またはハンドラーが見つからないという例外が発生していますか?

AppHostを構成するときに、「AccountService」クラスが含まれるアセンブリが「assembliesWithServices」パラメーターに追加されていることを確認してください。ルートがServiceStackによって取得されていないようです。

public MyAppHost() : base("my app", typeof(AccountService).Assembly) { }  

あなたのサービスクラスはどのように見えますか?

以下のようなものが機能するはずです(サービスインターフェースを忘れないでください)

public class AccountService : Service
{
    public object Any(AccountRequest request)
    {
        return new AccountResponse() { UserName = request.UserName};
    }
}
于 2013-03-26T22:28:58.697 に答える
0

回答ありがとうございます。C#クライアントは最初から正しいアドレスにリクエストを送信していたので、Fiddlerでデバッグしました。私だけがそれを適切に逆シリアル化していませんでした。

アカウントオブジェクトはdata、応答自体ではなく、応答のプロパティにありました。クライアントは、ServiceStackで構築されていない場合でも、RESTサービスの操作に優れています。かなりかっこいいです。

于 2013-03-26T23:19:58.187 に答える