2012-02-28 13 views
0

OK、なぜこれが機能しないのかわかりません。私は、Silverlight内でJSON Webサービスを非同期に呼び出す4つのチュートリアル/サンプルを見つけましたが、それらのすべては同じフォーマット/ロジックを使用しています。 "using(streamCommunities = request.EndGetRequestStream(asyncResult))"という行では、一番下にアタッチしたエラー、つまりasyncResultが気に入らないというArgumentExceptionがスローされています。他のすべての例で同じロジックが使用されている場合、これはなぜですか?Silverlight:WebサービスコールJSONエラー

private void GetSource(object state) 
    { 
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(MyValidUri)); 
    request.Method = "POST"; 
    request.ContentType = "application/json"; 
    request.BeginGetResponse(new AsyncCallback(ReadCommunityCallBack), request); 
    } 

    private void ReadCommunityCallBack(IAsyncResult asyncResult) 
    {    
     HttpWebRequest request = (HttpWebRequest)asyncResult.AsyncState; 

     using (Stream outStream = request.EndGetRequestStream(asyncResult)) 
     { 
      // DO STUFF HERE 
     } 
    } 

とエラーはここにある:

System.ArgumentException was unhandled by user code 
Message=Value does not fall within the expected range. 
    StackTrace: 
    at System.Net.Browser.ClientHttpWebRequest.EndGetRequestStream(IAsyncResult asyncResult) 
    at cenTabbedFeed.MainPage.ReadCommunityCallBack(IAsyncResult asyncResult) 
    at System.Net.Browser.ClientHttpWebRequest.<>c__DisplayClass1a.<InvokeGetResponseCallback>b__18(Object state2) 
    at System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(Object state) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
    at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem() 
    at System.Threading.ThreadPoolWorkQueue.Dispatch() 
    at System.Threading._ThreadPoolWaitCallback.PerformWaitCallback() 

私は例を精練し、MSDNの答えを見つけようと、私は立ち往生してイライラしていてきた、言ったように。

-Thanksは、事前に RJ

+0

try/catchブロックに配置することで例外をキャッチしようとします。そのエラーメッセージは、エラーをキャッチしていないことを示します。あなたがそれをキャッチするなら、多分あなたはそれについてもっと多くの情報を持っています。 –

+0

しかし多分あなたはそれについてもっと多くの情報を持っています。問題はサーバー側で発生する可能性があります。 –

+0

これは私が投稿したエラーを教えてくれる... e.Message =値が予想される範囲内に収まらない。それはエラーを解決しません。 –

答えて

1

リクエストメソッドはPOSTですが、あなたは何も投稿しないでください。 RequestStreamに何かを書き込むか、メソッドをGETに変更してください。

--EDIT--

UVEが間違った1つを得た

byte[] buf = Encoding.UTF8.GetBytes("key=value&key2=value2&key3=value3"); 
request.ContentType = "application/www-form-urlencoded"; 
request.ContentLength = buf.Length; 
request.GetRequestStream().Write(buf,0,buf.Length); 
+0

投稿データを持つカスタムクラスがありますが、リクエストストリームにどのように書き込むのですか? StreamWriterクラスとToString()メソッド –

+0

投稿するには、リクエストに本文を追加する必要があります。これはクエリ文字列のようです:key = value&key2 = value2&key3 = value3。フレームワークはすでにストリーム処理を抽象化しています。 –

+0

@ rjcup3、回答を更新しました –

0

以下のようにして、サーバーにいくつかの文字列を投稿することができます。ウルを使用してBeginGetResponse。私はちょうどACWで同じ問題を抱えていました。代わりにBeginGetRequestStreamに変更しました。すべて正常です。

+0

いいえ、実際は私は愚かで、POSTメソッドでWebRequestを使用する方法を知らなかったからです。 BeginGetResponseは私が終わったときに使ったものです。それはストリームに書いていて、私がうんざりしていた状態を渡していました。 –

関連する問題