2009-09-29 11 views
10

私はこれに数時間苦労しており、通信の問題の解決策を見つけることができません。 サービスがSOAPまたはプレーンXMLを介してクライアントと通信する必要がありますWCFサービス、SOAPまたはプレーンXMLのレスポンス、どのように?

私のサービスはWCFフレームワークに基づいて作成されますが、私のクライアントは作成されません。

サービスコードと設定をSOAPまたはXMLメッセージを返すように変更する方法を段階的に表示できますか?私は両方のソリューションに興味があります。

REST/SOAP endpoints for a WCF service Call WCF Using SOAP call

をしかし、この解決策のどれも私のために適切に働いた:

私はこの答えに、この基点を達成しようとしました。ブラウザで何も得られなかったり、リソースが見つかりませんでした。

私は新しいWCFサービスプロジェクトを開始しました。 http://localhost:3151/の下でそれを実行し、このようなコードを持っている:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Runtime.Serialization; 
using System.ServiceModel; 
using System.Text; 

namespace WcfService1 
{ 
    // NOTE: If you change the class name "Service1" here, you must also update the reference to "Service1" in Web.config and in the associated .svc file. 
    public class Service1 : IService1 
    { 
     public string GetData(int value) 
     { 
      return string.Format("You entered: {0}", value); 
     } 

     public CompositeType GetDataUsingDataContract(CompositeType composite) 
     { 
      if (composite.BoolValue) 
      { 
       composite.StringValue += "Suffix"; 
      } 
      return composite; 
     } 
    } 
} 

は、おそらく2つのエンドポイントを作成する必要がI'will?両方ともバインディングパラメータとしてbasicHttpBindingを含める必要があります。しかし、他に何がありますか?これよりもむしろ

<CompositeType BoolValue = 0 StringValue = ""> 

また、どのように(データ契約に基づいて)このようなXMLを生成する

<CompositeType> 
    <BoolValue>0</BoolValue> 
    <StringValue></StringValue> 
</CompositeType> 

私がする必要があることに注意してくださいを双方向通信ように私のサービスは、SOAPまたはXMLと応答をSOAPまたはXMLで受け取る必要があります。

また、可能であれば、私はASP .NETのようにサービスメソッドの説明をブラウザに表示したいと考えています。

お時間をいただきありがとうございます。

非常に大きなアップデートダウンここ

私はいくつかの解決策を見つけることを試みてきましたし、ここでは私がこれまでに収集されたものをすべてです。私は単純なXMLにのみ焦点を当ててきました。

プロトコルはこのようになっていることを言うことができます:クライアントから

メッセージ:

<MESSAGE MessageParam1 = 0> 
    <AdditionalInfo>Some message info </AdditionalInfo> 
</MESSAGE> 

応答:すべての

<RESPONSE ResponseParam1 = 0> 
    <AdditionalInfo>Some response info</AdditionalInfo> 
</MESSAGE> 

まず、私は現在の記述を見てみたいですサービスメソッドであり、送信/受信されるときの正確な形式でパラメータ化されます。

POST /Service1.asmx HTTP/1.1 
Host: localhost 
Content-Type: text/xml; charset=utf-8 
Content-Length: length 
SOAPAction: "http://tempuri.org/ShowUser" 

<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soap:Body> 
    <ShowUser xmlns="http://tempuri.org/"> 
     <MyLogin> 
     <User>string</User> 
     <Password>string</Password> 
     <Database>string</Database> 
     </MyLogin> 
    </ShowUser> 
    </soap:Body> 
</soap:Envelope> 

HTTP/1.1 200 OK 
Content-Type: text/xml; charset=utf-8 
Content-Length: length 

<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soap:Body> 
    <ShowUserResponse xmlns="http://tempuri.org/"> 
     <ShowUserResult>string</ShowUserResult> 
    </ShowUserResponse> 
    </soap:Body> 
</soap:Envelope> 

そして、これは素晴らしいです:私は何を意味することは、私がこのような応答を持っている私は、私は私のブラウザでサービスを呼び出したASP .NET 2.0 Webサービスを実験したとき(単にサービスを開始しました)ということです。SOAPエンベロープ(基になるデータも同じですが)は別ですが、クライアントにその情報を表示して、「あなたはそのようなXML構造でHTTP POSTメソッドを実行しています。私はWCFと同様の結果を望んでいますが、SOAPを使用しない場合でも簡単です。これまで、Service1.svcをクリックすると、私は望んでいないWSDLコードをたくさん取得しています。私はこれがいくつかのケースでは素晴らしいことを知っていますが、私のクライアントを使っているプラ​​ットフォームがわかりません。また、.NETを使用していない場合は、WSDLを正しくインポートしない可能性があります。

私は何をしたいのか分かります。

これは、私は2つの長い日後に、これまでにやったことです...:

namespace RESTService 
{ 
    // NOTE: If you change the interface name "IService1" here, you must also update the reference to "IService1" in Web.config. 

    [ServiceContract] 
    [XmlSerializerFormat] 
    public interface IService 
    { 
     [OperationContract] 
     [WebGet] 
     Response EchoWithGet(string s); 

     [OperationContract] 
     [WebInvoke] 
     Response EchoWithPost(string s); 
    } 

    public class Response 
    { 
     [XmlAttribute] 
     public int ResponseParam1; 
     [XmlElement] 
     public string AdditionalInfo; 
    } 
} 

あなたは私がブラウザを介しメソッドに渡す方法がわからないので、私は、メッセージクラスを提供していませんでした見ての通り。私は文字列を渡す方法しか知りません。

そして、ここに実装し、configです:

namespace RESTService 
{ 
    // NOTE: If you change the class name "Service1" here, you must also update the reference to "Service1" in Web.config and in the associated .svc file. 
    public class Service1 : IService 
    { 
     public Response EchoWithGet(string s) 
     { 
      Response Transaction; 
      Transaction = new Response(); 
      Transaction.AdditionalInfo = "I've responded: " + s; 
      return Transaction; 
     } 
     public Response EchoWithPost(string s) 
     { 
      Response Transaction; 
      Transaction = new Response(); 
      Transaction.AdditionalInfo = "I've responded: " + s; 
      return Transaction; 
     } 
    } 
} 

設定は私のためにも、謎のビットです。私はそれがMSDNのトピックのいずれかで説明されているようにバインディングを作成しようとしました:http://msdn.microsoft.com/en-us/library/aa395208.aspx

しかし、メソッドを呼び出した後、私はSOAPのようなフォールト構造を返しましたが、SOAPエンベロープはありませんでした。とにかくここ

はconfigです:

<system.serviceModel> 
     <services> 
     <service name="RESTService.Service1"> 
      <host> 
      </host> 
      <endpoint 
       address="rest" behaviorConfiguration="webBehavior" 
       bindingConfiguration="" binding="webHttpBinding" 
       contract="RESTService.IService"/> 
     </service> 
     </services> 
     <behaviors> 
     <endpointBehaviors> 
      <behavior name="webBehavior"> 
       <webHttp /> 
      </behavior> 
     </endpointBehaviors> 
     </behaviors> 
</system.serviceModel> 

私はこのように私のブラウザでのサービスメソッドを呼び出すとき:

http://localhost:2443/Service1.svc/rest/EchoWithGet?s=test

私は私のブラウザでXMLファイルを得ました

<Response ResponseParam1="0"> 
<AdditionalInfo>I've responded: test</AdditionalInfo> 
</Response> 

私は正しい軌道にいるようですか?しかし、まだ私は、送信されたものと受信されたものについての完全な情報(ASP .NET 2.0のようなもの)を受け取る方法を知らない。 HTTP経由で何が起こっているのかを調べるために、スニッファを使ってサービスポートを監視しないでください。私はそれを見たいと思います。また、私はこれを見受け取ったXMLのソースファイルを見ると:

<?xml version="1.0" encoding="utf-8"?><Response ResponseParam1="0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" <br/> 
xmlns:xsd="http://www.w3.org/2001/XMLSchema"><br/> 
<AdditionalInfo>I've responded: test</AdditionalInfo></Response> 

私はこれをカットする方法を、返されたXMLで、この追加情報を持ってしたくないですか?

もう一つの問題は、第二の方法である:

http://localhost:2443/Service1.svc/rest/EchoWithPost?s=test

予想通りこれは動作しません。私はエラーメッセージ "メソッドが許可されていません"を取得します。これを解決するには?

だから、この長い質問をまとめることができます。

私は正しい方法かもしれない、または間違った方法である、いくつかのハーフワーキングソリューションを持っています。

  1. XMLファイルをパラメータとして受け入れることをお勧めします。
  2. WebブラウザーでXMLをパラメーターとしてメソッドを呼び出す方法を教えてください。はい、.NETの別のクライアントにはしたくありません。ブラウザをクライアントにします。
  3. 返されたXMLで不必要な膨大な情報をどのようにカットするか教えてください。
  4. 私はSOAPを望んでいないことに気づいて、私のサービスの.NET 2.0のような記述を取得する方法を教えてください。
  5. EchoWithPostメソッドの何が問題なのか説明してください。なぜそれは動作しません?

私の例が悪い場合は、どのように達成すべきかの基本的な例を教えてください。

私は.NETとWCFを学んでいます。私は非常に混乱しています。これらの問題はすべて、正しいデータ交換プロトコルを設定することだけで...そして私は実際のサービスを書くためのstatredを持っていないこともあります。

お時間をいただき、今後のお手伝いをしていただき、ありがとうございます。

+0

@wozdu:あなたは完全に正しいトラックにいる。そのスクリーンキャストをWCF RESTサービスで「Plain Old XML」で見ることができます。これにより、必要な要素と属性だけで完全にカスタマイズされたXMLを返すことができます。 –

答えて

6

ここにあるサービスは、 "ペイロード"として "CompositeType"を含むSOAPメッセージを返します。

デフォルトでは、WCFはSOAPを使用します。基本的なHttpBinding、wsHttpBinding、netTcpBindingなどのすべてが、SOAPを基本として使用されます。

ストレートXMLを返す場合は、WCFのREST機能をチェックアウトする必要があります。これはwebHttpBinding(およびそのバインディングのみ)で機能します。これよりもむしろ

<CompositeType BoolValue = 0 StringValue = ""> 

また、どのように(データ契約に基づいて)このようなXMLを生成します

<CompositeType> 
    <BoolValue>0</BoolValue> 
    <StringValue></StringValue> 
</CompositeType> 

これは、WCF DataContractシリアライザの制限事項です。パフォーマンス上の理由から、属性をサポートしていません。必要なXMLの最初の断片を作成することはできません。

最初のXMLが必要な場合は、XmlSerializer(代わりに独自の制限事項があります)を使用する必要があります。

マルク・

UPDATE:あなただけ与えられたXMLを返すようにしたい場合は、その後、あなたはおそらくRESTのアプローチと方がいいでしょう。

Pluralsightのウェブサイトには、series of screencasts on using RESTがあり、特にplain-old XML (POX) REST serviceの作成方法に関するスクリーンキャストがあります。

+0

marc_sに感謝しますが、XMLSerializerでRESTを使用するにはどうすればよいですか?あなたはこの単純な仕事を遂行するために契約を放棄しなければならないと言っていますか?これは可能ですか? – Wodzu

+0

いいえ - 引き続き契約を使用できますが、探しているフォーマットが本当に**必要な場合は** DataContractSerializerの代わりにXMLシリアライザを使用してください。しかし、これは依然としてSOAP応答になります。 –

+0

marc_s:ありがとうございます。この仕様ではSOAPについて何も言及していません。だから私は、封筒を使わずにXMLだけを送受信する必要があると思う。このXMLには、私が質問で示したように属性が必要です。 XMLSerializerの使い方を教えてもらえますか?これは5時間目ですが、私は答えを探すのに費やしています。私はとても不満です;) – Wodzu

0

Enunciateをご覧ください。私はこれまでREST(XML & & JSON)インターフェイスとSOAPインターフェイスを作成するためにこれを使用しました。それはあなたが探しているものを正確に与えるかもしれませんし、それを扱うのはかなり簡単です。リードディベロッパーもメーリングリストで活発に活動しています。質問があれば、グループにメッセージを送り、通常は非常に迅速に対応します。

+0

ありがとうRandyaa、それを見るだろう。 – Wodzu

関連する問題