3

今週、ServiceStackを勉強する許可が与えられました。大好きです。それは素晴らしいフレームワークです。しかし、私はかなり簡単な例を機能させることができない状況に遭遇しました。(確かに例ほど単純ではありませんが、おそらくより現実的な例です。)

この長い質問について事前にお詫び申し上げます。

このようなデータベースにマップする単純なDTOがあります...

[Description("Customer")]
[Alias("Customers")]
    public class Customer : IHasId<int>
    {
        [Alias("Id")]
        [AutoIncrement]
        public int Id { get; set;}

        [Required]
        public int CompanyId { get; set;}

        [Required]
        public string FirstName { get; set;}

        [Required]
        public string LastName { get; set;}

        public string MiddleInitial { get; set;}
        public string EmployerName { get; set;}
        public string ServiceLocationDescription { get; set;}
        public string Street1 { get; set;}
        public string Street2 { get; set;}
        public string City { get; set;}
        public string State { get; set;}
        public string Zip { get; set;}

        [Required]
        public string Phone { get; set;}
        public string Fax { get; set;}

        [Required]
        public string EmailAddress { get; set;}
    }
}

このようなリクエストDTOも作成しました...

//request dto
[Route("/customers/{companyId/customer/{customerId}", "GET")]
public class GetCustomer  : Customer
{
}

[Route("/customers/{companyId}/customer/{customerId}", "PUT")]
public class UpdateCustomer  : Customer
{
}

ルートが同じであることに気づきました...それはおそらく問題です...しかし、私は異なるhttpメソッドを指定しています...。

最後に私はこのようなサービスを持っています...

public CustomerResponse Get(GetCustomer request)
{
    return new CustomerResponse { Customer = customerRepository.GetCustomer(request.CustomerId), };
}

public object Put(UpdateCustomer request)
{
    customerRepository.UpdateCustomer(request);
    return new HttpResult
    {
        StatusCode = HttpStatusCode.NoContent,
        Headers = {
            { HttpHeaders.Location, this.RequestContext.AbsoluteUri.CombineWith(request.Id.ToString()) }
        }
    };
}

それで、それをテストするために、私は次の簡単なhtmlを作成しました...

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
<meta content="en-us" http-equiv="Content-Language" />
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
<title>Untitled 1</title>
</head>

<body>

<form action="http://localhost:8080/co/1/customers/1000" method="get">
    <br />
    <label id="Label1">CompanyId&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    <input name="CompanyId" type="text" /></label><br />
    FirstName&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    <input name="FirstName" type="text" /><br />
    LastName&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    <input name="LastName" type="text" /><br />
    Middle Initial&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    **OTHER FIELDS**  
    <input type="submit" />
</form>

</body>

</html>

これらはすべて、PUTがGETサービスにルーティングしている場合にのみ正常に機能します。

もちろん、私の目標は顧客の行を新しい値で更新することです。

顧客リポジトリクラスを表示していませんが、正常に機能しています。私は推測する。具体的な一般的な質問があります。

GETの代わりにPUTにルーティングするにはどうすればよいですか。また、サービスを使用して更新を行うための「ベストプラクティス」はありますか。たとえば、PUTサービスは顧客オブジェクトではなく、すべての値を受け取る必要があります...次に、リポジトリコードがレコードをフェッチし、更新しますか?

POSTメソッド(図には示されていません)はうまく機能します。これは、PUTメソッドとまったく同じです(Customerオブジェクトを受け取るなど)

編集

また、DELETE httpメソッドを使用しようとすると、GETにもルーティングされると判断しました。これは、Customerからも継承しない単純なタイプです。2つの削除パラメーターを取得するだけです。今、私は本当に困惑しています。

編集2

具体的な型を返すサービスメソッドにのみルーティングしているようです。例外は、オブジェクトを返すPOSTです...Getは顧客の応答オブジェクトを返します。Get Customersは、Customers(plural)Responseオブジェクトを返し、機能します。残りのサービスメソッドはオブジェクトを返しています。それですか?

4

1 に答える 1

8

Eliが指摘したように、ブラウザはPUT/DELETEをサポートしていません。X-HTTP-Method-Override入力フィールドとして使用して、ServiceStackで動作させることができるはずです。@mythzは私の雷を盗み、ここでそれに対するサポートを追加しました(彼が私をこれに打ち負かすことについて苦いことはありません)

また、<form>メソッドは「get」であり、これは常にServiceStackのサービス「Get」メソッドにルーティングする必要があります。

テストされていませんが、これでうまくいくと思います。

<form action="http://localhost:8080/co/1/customers/1000" method="POST">
    <br />
    <input name="X-HTTP-Method-Override" type="hidden" value="PUT" />
    <label id="Label1">CompanyId&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    <input name="CompanyId" type="text" /></label><br />
    FirstName&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    <input name="FirstName" type="text" /><br />
    LastName&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    <input name="LastName" type="text" /><br />
    Middle Initial&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    **OTHER FIELDS**  
    <input type="submit" />
</form>
于 2013-03-15T17:04:07.323 に答える