1

Javascript 経由で「/api/X」パスを使用してサービスを呼び出すことができます。(投稿動詞)

client.Get(serviceUrl) //クライアントは JsonServiceClient を使用して、リクエスト オブジェクトなしで同じサービスを呼び出すことができます

しかし client.Send(X) は機能しません。奇妙な 404 NotFound 応答が表示されますか?

何か不足していますか?そして、どうすれば問題をデバッグできますか?

料金は今まで5時間!

チェックリスト

  • X クラスには 2 つの文字列プロパティがあります (enum または customType はありません)
  • X と XResponse には DataContract と DataMember 属性があります (トライアル)

コード:

AppHost.cs 内

    base.SetConfig(new EndpointHostConfig
        {
            GlobalResponseHeaders =
                {
                    { "Access-Control-Allow-Origin", "*" },
                    { "Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS" },
                },
            AppendUtf8CharsetOnContentTypes = new HashSet<string> { ContentType.Html },
            DebugMode = true, //Show StackTraces in service responses during development
            LogFactory = new ElmahLogFactory(new Log4NetFactory())
        });

        //Set JSON web services to return idiomatic JSON camelCase properties
        ServiceStack.Text.JsConfig.EmitCamelCaseNames = true;

        //Configure User Defined REST Paths
        Routes.Add<JobRequest>("/job");

Model.cs 内

  [DataContract]
public class JobRequest : IReturn<JobRequestResponse>
{
    [DataMember]
    public string JobRequestEnum { get; set; }
    [DataMember]
    public string JobData { get; set; }
}

[DataContract]
public class JobRequestResponse : IHasResponseStatus
{
    [DataMember]
    public string Message { get; set; }

    [DataMember]
    public ResponseStatus ResponseStatus { get; set; }
}

JobService.cs 内

 public class JobService : ServiceStack.ServiceInterface.Service
{
    public JobRepository Repository { get; set; }

    public object Any(JobRequest request)
    {
        return new JobRequestResponse() { Message = "ok" };
    }
}

Javascript.js で // IT WORKS

$.ajax({
type: 'POST',
url: "/api/job",
data: '{ "jobRequestEnum": "test", "jobData": "test" }',
dataType: "json",
contentType: "application/json",
success: function (res) {
    debugger;
}

});

CallJob.js では // 機能しません

string serviceUrl = ConfigurationManager.AppSettings["serviceUrl"];

        using (JsonServiceClient client = new JsonServiceClient(serviceUrl))
        {
            var request = new JobRequest() { JobData = "test", JobRequestEnum = "test" };
            var response = client.Send<JobRequestResponse>(request);
        }
4

1 に答える 1

2

[Route]次のようにリクエストDTOにを追加する場合:

[Route("/job")]
[DataContract]
public class JobRequest : IReturn<JobRequestResponse>
{
    [DataMember]
    public string JobRequestEnum { get; set; }
    [DataMember]
    public string JobData { get; set; }
}

新しいIReturnC#クライアントAPI

/jobその後、C#クライアントはクライアントでカスタムルートを使用できるようになります。例:

var client = new JsonServiceClient(serviceUrl);
var request = new JobRequest { JobData = "test", JobRequestEnum = "test" };
JobRequestResponse response = client.Post(request);

リクエストDTOでルートが定義されていない場合、またはレスポンスタイプを指定していない場合は、次のようになります。

var response = client.Send<JobRequestResponse>(request);

IReturn<T>C#クライアントAPIを使用していないため、事前定義されたルートにPOSTが送信されます。これは次のようになります。

POST /json/syncreply/JobsRequest
{ ... }

想定しているとおりではありません/jobs(つまり、C#クライアントにはルート情報を知る方法がないため、事前定義されたルートの使用にフォールバックします)。

/customrouteを使用するように手動で指定する

それ以外の場合、ルート定義をAppHostに保持する場合は、C#呼び出しで指定することにより、事前定義されたURLを使用するように強制できます。例:

client.Post<JobRequestResponse>("/job", request);

'Response'サフィックスは必要ありません

また、新しいAPI(およびIReturn<T>マーカーを使用する場合)では、Request DTO +'Response'の命名規則が不要になり、必要な名前を自由に選択できるためJobRequestResponse、少し厄介に聞こえる名前である必要はありません。 )。

于 2012-10-10T00:09:16.693 に答える