1

私は HttpWebRequest を使用して Twitter API のような Json リソースを取得しています。シナリオは、XAuth-Authentication でアプリにログインした後、アプリが API( http://api.xxx.com/account/notification.json ) レスポーズ Json を取得します。私の HttpWebRequest メソッドは次のとおりです。

public void Request(string url)
        {
            var request = (HttpWebRequest)HttpWebRequest.Create(url);

            IAsyncResult result = null;
            result = (IAsyncResult)request.BeginGetResponse(ResponseCallback, request);
        }

        private void ResponseCallback(IAsyncResult result)
        {
            try
            {
                var request = (HttpWebRequest)result.AsyncState;
                var response = request.EndGetResponse(result);


                using (var stream = response.GetResponseStream())
                {
                    using (var reader = new StreamReader(stream))
                    {

                        if (CallBack != null)
                        {
                            var str = reader.ReadToEnd();
                            CallBack(CleanInvalidXmlChars(str));
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Deployment.Current.Dispatcher.BeginInvoke(delegate
                {
                    CallBack(ex.ToString());
                });
            }
        } 

最も一般的な状況では、すべてがうまくいきます。一部のユーザーが、常に例外が発生したと私に言うまで。次に、デバッグを使用して、例外トレースが次のようになっていることを確認します。

"System.ArgumentException ---> System.ArgumentException: [net_WebHeaderInvalidControlChars]\r\nArguments:\r\nDebugging resource strings are unavailable. Often the key and arguments provide sufficient information to diagnose the problem. See http://go.microsoft.com/fwlink/?linkid=106663&Version=4.7.60408.0&File=System.Net.dll&Key=net_WebHeaderInvalidControlChars \r\nParameter name: name\r\n   at System.Net.ValidationHelper.CheckBadWebHeaderChars(String name, Boolean isHeaderValue)\r\n   at System.Net.WebHeaderCollection.set_Item(String name, String value)\r\n   at System.Net.Browser.HttpWebRequestHelper.AddHeaderToCollection(WebHeaderCollection headerCollection, String headerName, String headerValue)\r\n   at System.Net.Browser.HttpWebRequestHelper.ParseHeaders(Uri requestUri, SecurityCriticalDataForMultipleGetAndSet`1 headers, WebHeaderCollection collection, Boolean removeHttpOnlyCookies, HttpStatusCode& status, String& statusDescription)\r\n   at System.Net.Browser.ClientHttpWebRequest.Progress(Object sender, EventArgs e)\r\n   at MS.Internal.CoreInvokeHandler.InvokeEventHandler(Int32 typeIndex, Delegate handlerDelegate, Object sender, Object args)\r\n   at MS.Internal.JoltHelper.FireEvent(IntPtr unmanagedObj, IntPtr unmanagedObjArgs, Int32 argsTypeIndex, Int32 actualArgsTypeIndex, String eventName)\r\n\r\n   at System.Net.Browser.AsyncHelper.BeginOnUI(SendOrPostCallback beginMethod, Object state)\r\n   at System.Net.Browser.ClientHttpWebRequest.EndGetResponse(IAsyncResult asyncResult)\r\n   at FanfouSDK.Utiltiy.HttpGetMethod.ResponseCallback(IAsyncResult result)\r\n   at System.Net.Browser.ClientHttpWebRequest.<>c__DisplayClassa.<InvokeGetResponseCallback>b__8(Object state2)\r\n   at System.Threading.ThreadPool.WorkItem.WaitCallback_Context(Object state)\r\n   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)\r\n   at System.Threading.ThreadPool.WorkItem.doWork(Object o)\r\n   at System.Threading.Timer.ring()\r\n"

ここにいくつかの問題があるようです( System.Net.Browser.ClientHttpWebRequest.EndGetResponse throw System.ArgumentException when header contains non-ascii content )

次に、Fiddler を使用して webresponse をトレースし、サーバーが予期された Json 文字列を返したことを発見しましたが、それでも例外が発生しました。

予想される Json 文字列: ここに画像の説明を入力 Everythis は問題ありませんが、まだ net_WebHeaderInvalidControlChars 例外が発生します。X-Authuser が原因ですか?

私は解決策を見つけるために一生懸命働きましたが、失敗しました。任意の提案をいただければ幸いです。ありがとう。

PS: 実デバイスでアプリを実行すると例外が発生しないのに、エミュレータと相手の実デバイスで例外が発生するというのは少し奇妙です。

4

1 に答える 1

2

これは、ヘッダー (X-AuthUser) に含まれる漢字が原因であると思われます。この問題はここでもキリル文字で説明されているため、同じシナリオである可能性が高いです。

于 2012-04-12T03:28:58.520 に答える