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;
}