0

Silverlight 4 から wcf rest サービスに画像を投稿しようとしていますが、リクエストから応答を取得しているときに例外が発生します。例外は次のとおりです。

System.Net.WebException: リモート サーバーがエラーを返しました: NotFound. ---> System.Net.WebException: リモート サーバーがエラーを返しました: NotFound。System.Net.Browser.BrowserHttpWebRequest.InternalEndGetResponse (IAsyncResult asyncResult) で System.Net.Browser.BrowserHttpWebRequest.<>c_ DisplayClassa.b _9 (オブジェクト sendState) で System.Net.Browser.AsyncHelper.<>c_ DisplayClass4.b _1 (Object sendState) --- 内部例外スタック トレースの終了 --- System.Net.Browser.AsyncHelper.BeginOnUI(SendOrPostCallback beginMethod, Object state) at System.Net.Browser.BrowserHttpWebRequest.EndGetResponse(IAsyncResult asyncResult) at Admin. Popups.AddCategory.OnImageGetResponseCompleted(IAsyncResult ar)}

Androidからアクセスしようとすると、サービスの他のすべての機能が正常に機能します.Silverlightクロスドメインポリシーをすでに見て試してみましたが、適用できるとは思いません.私のコードは以下のとおりです.

private void UpLoadImage()
        {
            string URL = Utilities.GetServiceUrl() + "AddCategoryImage?CategoryId=2&ContentType=image&apikey=" + Utilities.GetApiKey();
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL);
            request.Method = "POST";
            request.ContentType = "text/plain";
            request.ContentLength = SelectedFile.Length;

            request.BeginGetRequestStream(OnImageGetRequestStreamCompleted, request);
        }

        private void OnImageGetRequestStreamCompleted(IAsyncResult ar)
        {
            try
            {
                if (SelectedFile != null)
                {
                    HttpWebRequest request = (HttpWebRequest)ar.AsyncState;

                    using (Stream postStream = request.EndGetRequestStream(ar))
                    {
                        using (Stream source = SelectedFile.OpenRead())
                        {
                            byte[] buffer = new byte[2048];
                            int bytesRead;
                            while ((bytesRead = source.Read(buffer, 0, buffer.Length)) > 0)
                            {
                                postStream.Write(buffer, 0, bytesRead);
                            }
                        }

                   }

                    request.BeginGetResponse(new AsyncCallback(OnImageGetResponseCompleted), request);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void OnImageGetResponseCompleted(IAsyncResult ar)
        {
            try
            {
                HttpWebRequest request = (HttpWebRequest)ar.AsyncState;
                HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(ar);
                using (StreamReader sr = new StreamReader(response.GetResponseStream()))
                {
                    string result = sr.ReadToEnd();
                }
            }
            catch (Exception ex)
            {
                this.Dispatcher.BeginInvoke(delegate()
                        {
                            MessageBox.Show(ex.Message);
                        });
            }
        }

wcf関数は

[OperationContract]
        [WebInvoke(Method = "POST", UriTemplate = "AddCategoryImage?CategoryId={CategoryId}&ContentType={ContentType}", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest)]
        bool AddCategoryImage(int CategoryId, string ContentType, Stream Image);

関数の実装は

 public static bool AddCategoryImage(int CategoryId, string ContentType,Stream Image)
        {
            SqlConnection sqlCon = new SqlConnection(Params.GetConnectionString());
            SqlCommand sqlCmd = new SqlCommand("UPDATE Categories SET Cat_Img = @Cat_Img,Cat_Img_Type = @Cat_Img_Type WHERE Cat_ID = @Cat_ID", sqlCon);
            sqlCmd.Parameters.Add("@Cat_Img", SqlDbType.Image).Value = Utility.ConvertStreamToByteArray(Image);
            sqlCmd.Parameters.Add("@Cat_Img_Type", SqlDbType.NVarChar, 32).Value = ContentType;
            sqlCmd.Parameters.Add("@Cat_ID", SqlDbType.Int).Value = CategoryId;

            try
            {
                sqlCon.Open();

                return sqlCmd.ExecuteNonQuery() > 0 ? true : false;
            }
            catch (Exception ex)
            {
                Error.CreateError(ex.Message, "Category.cs", "AddCategoryImg(int,string,Stream)");
            }
            finally
            {
                sqlCon.Close();
            }

            return false;
        }
4

1 に答える 1

1

私は問題を解決しましたWCFdefualtmaxReceivedMessageSizeが65Kで、65kを超えるファイルをアップロードしようとしていたので、賢いです:) maxReceivedMessageSize = "2000000"を2MBに設定すると、最大2MBのファイルで機能するようになります

<binding name ="webBinding" sendTimeout="00:10:00" receiveTimeout="00:10:00" openTimeout="00:10:00"  closeTimeout="00:10:00" maxReceivedMessageSize="2000000">
    <readerQuotas maxDepth="32" maxStringContentLength="100000000" maxArrayLength="100000000" maxBytesPerRead="100000000" maxNameTableCharCount="100000000" />
</binding>
于 2012-11-07T09:44:46.203 に答える