2016-04-13 10 views
1

第三者からXMLを使用するには、Web APIのMVC RESTサービスを開発する必要があります。Web APIのmvc着信XMLルートが異なる

プロジェクトは、サンプルXMLファイルに基づいてCodeFirst Entity Frameworkを使用して作成されています。

アップデート、投稿、削除用のテストXMLファイルを受け取ったのは、驚いたことに、メソッドごとにルートxml要素が異なります。

POSTのルートは、PUTのルートは、私は根が常にすべてのメソッドのために、CreateSomethingされ作成されたモデルでは

をUpdateSometingさ

をCreateSomethingています。

別の方法で追加のモデルを作成する必要はありますか?または、これを回避する別の方法がありますか?

希望問題を明確にしました。事前

よろしく

EDITで

ありがとう: これは予想されるXML入力であるが、これはPOSTのために動作します。

<CreateBookingRequest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <ID>a10601e4-c24d-4e7d-9c11-ae5a35fb5770</ID> 
    <ApiKey>sample string 2</ApiKey> 
    <Booking> 
<BookingId>22c9a3ce-58d1-4a7e-b483-897e29aa3f6a</BookingId> 
<Travellers>  
    <Traveller Id="8"> 
    <TravellerId>0792a822-92d0-4e9a-88b2-f6fae02221f2</TravellerId> 
    <DateOfBirth>2016-04-13T11:56:02.4407937+02:00</DateOfBirth> 
    <Gender>sample string 3</Gender> 
    <FirstName>sample string 4</FirstName> 
    <LastName>sample string 5</LastName> 
    <CountryCode>sample string 6</CountryCode> 
    <PrefferedLanguageCode>sample string 7</PrefferedLanguageCode> 
    <Communication> 
     <CommunicationId>fbf1eeda-73bf-4381-a751-5a2da346e7a0</CommunicationId> 
     <Email> 
     <EmailId>45069245-c2af-4c55-934f-e033da0fbb5e</EmailId> 
     <Value>sample string 2</Value> 
     <Culture>sample string 3</Culture> 
     </Email> 
     <Sms> 
     <SmsId>261db3a9-d858-47e9-934b-07981d203155</SmsId> 
     <Value>sample string 2</Value> 
     <Culture>sample string 3</Culture> 
     </Sms> 
     <EmailId>6a4005d4-8f05-4999-9098-1078b2c12ebf</EmailId> 
     <SmsId>d5d8f3df-b08c-4954-9e6c-b29a3a74a3e8</SmsId> 
    </Communication> 
    <BookingId>4baf0cad-75d8-4067-a3d1-bd70f1b219ad</BookingId> 
    </Traveller> 
</Travellers>  
    </Booking> 
</CreateBookingRequest> 

しかし、PUT XML入力は次のようになります。

<UpdateBookingRequest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <ID>a10601e4-c24d-4e7d-9c11-ae5a35fb5770</ID> 
    <ApiKey>sample string 2</ApiKey> 
    <Booking> 
    <BookingId>22c9a3ce-58d1-4a7e-b483-897e29aa3f6a</BookingId> 
    <Travellers>  
    <Traveller Id="8"> 
    <TravellerId>0792a822-92d0-4e9a-88b2-f6fae02221f2</TravellerId> 
    <DateOfBirth>2016-04-13T11:56:02.4407937+02:00</DateOfBirth> 
    <Gender>sample string 3</Gender> 
    <FirstName>sample string 4</FirstName> 
    <LastName>sample string 5</LastName> 
    <CountryCode>sample string 6</CountryCode> 
    <PrefferedLanguageCode>sample string 7</PrefferedLanguageCode> 
    <Communication> 
     <CommunicationId>fbf1eeda-73bf-4381-a751-5a2da346e7a0</CommunicationId> 
     <Email> 
     <EmailId>45069245-c2af-4c55-934f-e033da0fbb5e</EmailId> 
     <Value>sample string 2</Value> 
     <Culture>sample string 3</Culture> 
     </Email> 
     <Sms> 
     <SmsId>261db3a9-d858-47e9-934b-07981d203155</SmsId> 
     <Value>sample string 2</Value> 
     <Culture>sample string 3</Culture> 
     </Sms> 
     <EmailId>6a4005d4-8f05-4999-9098-1078b2c12ebf</EmailId> 
     <SmsId>d5d8f3df-b08c-4954-9e6c-b29a3a74a3e8</SmsId> 
    </Communication> 
    <BookingId>4baf0cad-75d8-4067-a3d1-bd70f1b219ad</BookingId> 
    </Traveller> 
</Travellers>  
    </Booking> 
</UpdateBookingRequest> 

変更されたルートxmlのため、XMLのシリアル化は失敗します。

UpdateBookingRequestのような別のモデルを追加できますか?

サンプルコード:

// PUT: api/CreateBookingRequests/5  
[Route("update/{id:guid}")] 
[ResponseType(typeof(void))] 
public IHttpActionResult PutCreateBookingRequest(Guid id, CreateBookingRequest createBookingRequest) 
{ 
    if (!ModelState.IsValid) 
    { 
     return BadRequest(ModelState); 
    } 

    if (id != createBookingRequest.ID) 
    { 
     return BadRequest(); 
    } 

    db.Entry(createBookingRequest).State = EntityState.Modified; 

    try 
    { 
     db.SaveChanges(); 
    } 
    catch (DbUpdateConcurrencyException) 
    { 
     if (!CreateBookingRequestExists(id)) 
     { 
      return NotFound(); 
     } 
     else 
     { 
      throw; 
     } 
    } 

    return StatusCode(HttpStatusCode.NoContent); 
} 
+0

あなたが行ったことをよりよく理解し、他の人があなたの問題を再現して解決策を提供できるようにするコードを表示できますか? – Nkosi

+0

こんにちは、もっと情報を追加しました。ありがとう – Heisa

+0

xmlを処理するメソッドのサンプルコードを表示します。あなたの問題が何であるかははっきりしていません。 – Nkosi

答えて

0

ない私はあなたが完全に求めているものを理解してください。ここで

は、あなたのモデル

public abstract class RequestModelBase { 
    //All the properties that are common to your models 
} 

はその後に基づいて共通のベース

public class UpdateBookingRequest : RequestModelBase {...} 

public class CreateBookingRequest : RequestModelBase {...} 

UPDATEから継承あなたの異なるモデル用のクラスを作成するためのベースとして機能するクラスですあなたコメントはコントローラ例です

[RoutePrefix("api/bookings")] 
public class BookingsController: ApiController { 

    // POST: api/Bookings 
    [HttpPost]  
    [Route("")] 
    public IHttpActionResult PostBooking(CreateBookingRequest request) {...} 

    // PUT: api/Bookings/a10601e4-c24d-4e7d-9c11-ae5a35fb5770 
    [HttpPut]  
    [Route("{id:guid}")] 
    [ResponseType(typeof(void))] 
    public IHttpActionResult PutBooking(Guid id, UpdateBookingRequest request) {...} 

    // DELETE: api/Bookings/a10601e4-c24d-4e7d-9c11-ae5a35fb5770 
    [HttpDelete]  
    [Route("{id:guid}")] 
    public IHttpActionResult DeleteBooking(Guid id) {...} 
} 
+0

これは私が探しているものだと思います!それを試してみようとすると、それが動作している場合、yopuに知らせる。ありがとう – Heisa

+0

既に存在するCreateBookingRequestController以外のコントローラも追加する必要がありますか? – Heisa

+0

すべてのアクションを1つのコントローラに入れることはできません。'CreatBooking'や' UpdateBooking'のようなアクションを持つ 'BookingsController'のように。サンプルコードでPUTアクションの '[HttpPutAttribute]'が見つからないことに気付きました – Nkosi

関連する問題