4

私は、REST WCF サービスを (経由でWebServiceHost) 次のような (単純化された) コントラクトで公開する WPF アプリケーションを持っています。

[ServiceContract]
public interface IItemServiceContract
{
    [WebGet(UriTemplate = "Items/{id}")]
    Item GetItem(string id);

    [WebGet(UriTemplate = "Items")]
    IEnumerable<Item> GetItems();

    [WebInvoke(UriTemplate = "Items", Method = "PUT")]
    IEnumerable<Item> CreateItems(IEnumerable<Item> list);
}

ブラウザでに移動するhttp://localhost:8070/Contoso/Services/Items/ItemService/Itemsと、次のような応答が返されます。

<ArrayOfItem xmlns="http://schemas.datacontract.org/2004/07/Contodo.Services.Items" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <Item>
    <ItemState>
      <Comment i:nil="true"/>
      <DeactivationTime>0001-01-01T00:00:00</DeactivationTime>
      <Id>18f1a5e4-a94a-4f37-a533-3a75a10e7373</Id>
      <IsSpecial>false</IsSpecial>
    </ItemState>
    <ItemTypeId>10</ItemTypeId>
    <HelpInfo/>
    <Identity>Ident1</Identity>
    <AdditionalInfo>
      &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-16&quot;?&gt;
      &lt;Content&gt;
        &lt;SpecialContent /&gt;
      &lt;/Content&gt;</AdditionalInfo>
    <TextParameter>kjhdfsjh kj dkfjg kj</TextParameter>
    <UserName i:nil="true"/>
  </Item>
</ArrayOfItem>

このサービスを JavaScript で利用するための簡単で摩擦のないアプローチは何でしょうか? クライアントはどうすれば http リクエストとそれに適した XML をすばやく構築できますか?

Item私はかなり Html5/javaScript の世界にいますが、C# では、XML にシリアル化されるオブジェクトを中心とした API を配置します。しかし、それはここで行く方法ですか?

アップデート:

最初のコメントと回答に基づいて、XML は JavaScript/Web ブラウザーの消費者にとって理想的な形式ではないようですが、形式を JSON に変更することはできません。これは、既にこの XML 形式に依存している既存のクライアントが壊れる可能性があるためです。理想的には、REST コンテンツ タイプ ネゴシエーションを行い、JSONまたはXML を put/get します。しかし、これは WCF REST サービスで実行できますか?

4

5 に答える 5

4

ASP.NET 4.X を使用しているとします。

WCF 4 は、リクエストの HTTP "Accept" および "Content-Type" ヘッダーに基づく自動形式選択をサポートしています。ファイル内の1 つの指定automaticFormatSelectionEnabled="true"属性:web.config

<configuration>
  <system.serviceModel>
    <standardEndpoints>
      <webHttpEndpoint>
        <!-- the "" standard endpoint is used for auto creating a web endpoint. -->
        <standardEndpoint name=""
                          helpEnabled="true"
                          automaticFormatSelectionEnabled="true"/>
      </webHttpEndpoint>
    </standardEndpoints>
  </system.serviceModel>
</configuration>

詳細については、記事の「メッセージ形式の選択」の部分と記事を参照てください。automaticFormatSelectionEnabled属性をdefaultOutgoingResponseFormatと組み合わせることができます (「xml」または「json」に設定できます。デフォルトは既に「xml」です)。standardEndpoint上記の例のように使用する代わりに、1 つの特定のエンドポイントに対してのみ属性を指定できます。

したがって、対応する WCF 構成を使用する場合、既存の WCF サービスは JavaScript 要求に JSON データを提供するだけで、他のクライアントには XML データを返します。

于 2013-05-08T13:46:49.333 に答える
1

これを試して

Json タイプの結果の場合

インターフェイスで

         [WebInvoke(Method = "POST", UriTemplate = "/ItemGetItem?id={id}", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
        [OperationContract]
        void  ItemGetItem(string id);

スクリプト内

self.GetItem= function () {

         try {

             $.ajax({
                 type: "POST",
                 url: "Your Url",
                 contentType: 'application/json',
                 async: false,
                 dataType: 'json',
                 cache: false,
                 success: function (response) {




                 },
                 error: function (ErrorResponse) {


                 }

             });

         }

         catch (error) {


         }

     }

クライアント アプリケーションのエンドポイントを配置して、このサービスを使用する

于 2013-05-06T08:49:31.310 に答える
0

まず、 http://www.codeproject.com/Articles/33234/A-beginner-s-guide-for-using-a-WCF-service-inを見ましたか

しかし、私の意見では、フォーマットを Json に変更するのが最も簡単な方法です。コード プロジェクトに関する優れた記事もあります: http://www.codeproject.com/Articles/327420/WCF-REST-Service-with-JSON

于 2013-05-03T21:42:48.047 に答える
0

jQuery を使用している場合は、$.get 関数 ( http://api.jquery.com/jQuery.get/ ) を使用して、データ型として "xml" を指定できます。

$.get('http://.../', params, function(data) {
 //process data
}, 'xml');

そうでない場合は、xmlHttpRequest を直接 ( http://www.w3schools.com/xml/xml_parser.aspから)使用する必要があります。

  if (window.XMLHttpRequest)
  {// code for IE7+, Firefox, Chrome, Opera, Safari
    xmlhttp=new XMLHttpRequest();
  }
  else
  {// code for IE6, IE5
     xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
  xmlhttp.open("GET",url,false);
  xmlhttp.send();
  xmlDoc=xmlhttp.responseXML;

次に、ネイティブの javascript xml パーサーを使用して、xml ノードをトラバースするのは非常に簡単です。

ただし、JSON の方が適切です。http://localhost:8070/Contoso/Services/Items/ItemService/Items.json結果を JSON 形式で返すルートを追加できます。または、URL にパラメーターを追加することもできます。どちらのメソッドも、明示的に要求した場合にのみ JSON を返します。そのため、xml 応答を使用している既存のコードは引き続き正常に動作します。

于 2013-05-12T05:46:33.773 に答える