2012-01-02 4 views
0

私が達成しようとしているのは、WCF RESTベースのサービスにGETメソッドを追加し、Silverlight 3クライアントアプリケーションからWebRequestクラスを介してアクセスすることです。WCF RESTベースのGETリクエストの生のXMLの保持

エラーが発生しましたリモートサーバーからエラーが返されました:NotFound。私は理解しているように、サーバ上で発生した500エラーの一般的なエラーに過ぎません。

WCFの動作契約:

[OperationContract, WebGet(UriTemplate = "path/{id}")] 
Stream Get(string id); 

操作の実装:例外をスロー

public Stream Get(string id) 
{ 
    WebOperationContext.Current.OutgoingResponse.ContentType = "application/xml; charset=utf-8"; 

    return new MemoryStream(Encoding.UTF8.GetBytes("<xml><id>1</id><name>Some Name</name></xml>)); 
} 

クライアントコード:

HttpWebRequest webRequest = WebRequest.CreateHttp("http://domain.com/my-service.svc/path/1"); 

webRequest.BeginGetResponse(
    x => 
    { 
     try 
     { 
      using (WebResponse webResponse = webRequest.EndGetResponse(x)) <--Exception thrown here 
      using (Stream stream = webResponse.GetResponseStream()) 
      { 
       //do stuff here...eventually. 
      } 
     } 
     catch (Exception ex) 
     { 
     } 
    }, 
    null); 

私はそれが戻り値の型とは何かを持っていると思われますXmlElementを返すこともできませんでした。私は本当にここで困惑しています。

私はFiddlerとWebブラウザを使用してこのメ​​ソッドを正常に実行できます。

+0

@rekire。また、私はこのサービス定義に取り組んでいる他の多くのメソッドを持っていますが、失敗した 'Stream'や' XmlElement'の戻り値の型を持つメソッドを作成すると、 – Craig

+0

@rekireを見ていただきありがとうございます。 – Craig

答えて

1

経由aviableだろう適切属性initializeDataでファイル名を変更(web.configファイルに以下のコードを入れてみてください。

の場合CasiniやIIS Expressではなく、完全なIISを使用しています(後者を使用します)、Webアプリケーションに書き込み権限がある場所にログファイルを配置してください。これにより、WCFはかなり詳細なログファイルを生成します。私はログがかなり便利だと分かった。ここで

 

<system.diagnostics> 
    <sources> 
    <source name="System.ServiceModel" 
      switchValue="Information, ActivityTracing" 
      propagateActivity="true"> 
     <listeners> 
     <add name="traceListener" 
      type="System.Diagnostics.XmlWriterTraceListener" 
      initializeData= "c:\temp\WEBTraces.log" /> 
     </listeners> 
    </source> 
    </sources> 
</system.diagnostics> 
 
+0

提案をありがとう!残念ながら、私はログファイルを読み取ることができないように私がテストしているサーバーに直接アクセスする必要はありません。サービス自体はSSLであり、クレームベースのWIFサービスであるため、サーバーへのアクセスがなくてももう少し複雑になります。 – Craig

+0

+1と私は正しい答えとしてこれをマークしていますが、私はすでにこれを設定していましたが、今朝までにファイルを見るためのサーバへのアクセス権を持っていませんでした。確かに、私はログを私に送るために管理者の一人を持っており、それは例外を示しました。例外はローカルで動作していたために不明瞭でした...例外はロードバランスされたサーバーの1つに証明書がないために発生しました...もちろん私のローカルマシンに証明書をインストールしていたので問題はありませんでした。あなたの提案をありがとう! – Craig

+0

喜んで私はクレイグありがとう!ありがとう!興味深いもの: – JMarsch

0

NotFoundは、404ではなく500である必要があります。誤ったURIによって404エラーが生成される可能性があります。あなたのサービス上記のコード例で

Uri resturi = new Uri(String.Format("http://{0}:8080/MyService/", hostname)); // http 
WebHttpBinding rest = new WebHttpBinding(WebHttpSecurityMode.TransportCredentialOnly); // WebHttpSecurityMode.Transport for ssl 
host.AddServiceEndpoint(typeof(IMyService), rest, resturi); 

http://host:8080/MyService/path/1

+0

正しいですが、NotFoundは404エラーですが、サーバー上で500のエラーがスローされた場合、Silverlightクライアント経由で接続すると500が表示されるようです。これはSoilverlightのケースではないと言っていますか? (私はSilverlight開発者ではありません)。URLに関しては、WebブラウザとFiddlerを使用してメソッドに正常にアクセスすることができ、クライアントコードが実行された場所からURLをコピーして貼り付けました。実際にコード内で正しい 'CreateHttp'への呼び出しでタイプミスが見つかったので、質問を更新します。ごめんなさい。どんなフォローアップ思考? – Craig

1

はチェックする別のものです:あなたのSilverlightアプリは(例から実行されているようdomain.comまったく同じドメイン名です - あなたのSLのアプリがローカルホスト/ XXおよびドメインに行くあなたのWebサービスコールとして開始されます.com?

セキュリティ上の理由から、Silverlightは、被ドメインが許可されていない限り(Flashと同じ)、クロスドメインWebサービスの呼び出しを行いません。

ここで読むことができます:http://weblogs.asp.net/jgalloway/archive/2008/12/12/silverlight-crossdomain-access-workarounds.aspx

そこには、ビデオはここにある:http://www.silverlight.net/learn/data-networking/introduction-to-data-and-networking/how-to-use-cross-domain-policy-files-with-silverlight

いくつかのヘルパーがここにあります:私は `WebHttpBinding`を使用していhttp://timheuer.com/blog/archive/2008/04/06/silverlight-cross-domain-policy-file-snippet-intellisense.aspx

+0

Silverlightアプリケーションは、WCFサービスと同じサーバー上で実行されていません。しかし、私は現在、同じサービス内で期待どおりに機能するいくつかのサービスメソッドを持っています。他のすべてのメソッドは、直列化可能なオブジェクトを返します。この問題は、戻り値の型を 'Stream'または' XmlElement'に変更するときに頭が痛いだけを示します。 Silverlightアプリケーションに 'Stream'を返すことと組み合わせて' WebRequest'を使用した方法は、セキュリティ上の問題の可能性はないと思いますか? Silverlightは、私が強くしているものではありません。 – Craig

+0

+1、役に立つリンク、ありがとうございます。まだ問題の根本に辿り着いていますが、セキュリティには関係があります。私は両方のXMLファイルを追加しようとしましたが、そこには行きません。 – Craig

+0

@Craigストリームを返すことは一度もありませんでした。私たちはSilverlight Webサービスの仕事のほとんどにWCF RIAサービスを使用しています。 silverlightは基本的なhttpバインディングしかサポートしていないので、ws- *の拡張子を使用することはできません。 – JMarsch

関連する問題