Xamarin.Forms 通过 HttpClient SendAsync 以 Json 格式发送大图片时出现问题
Xamarin.Forms problems sending large picture over HttpClient SendAsync in Json format
在我的 Xamarin.Forms 应用程序中,我使用 Json 格式的 HttpClient 将图片和其他字段发送到服务器。
如果我发送一张我用前置摄像头拍摄的小照片,它工作正常,如果我发送一张我用后置摄像头拍摄的更大的照片,它就不起作用,我总是得到一个例外:"Excepional error"。
我尝试在 windows 表单应用程序中创建相同的代码,它也可以很好地处理大图像,但不是来自我的应用程序。
我已经在服务器上修改 web.config 以增加 json 内容大小:
<jsonSerialization maxJsonLength="50000000"/>
有人可以帮忙吗?!谢谢!!
这是我应用程序中的代码:
public async static Task<MyAppDataModels.Common.WsResponse> PostPhotoFromUser(int catalogItemId, int objReferenceId, int languageId, byte[] fileContent)
{
MyAppDataModels.Common.WsResponse MyResponse = new MyAppDataModels.Common.WsResponse();
try
{
HttpClient MyHttpClient = new HttpClient();
MyHttpClient.Timeout = TimeSpan.FromSeconds(520);
MyHttpClient.BaseAddress = new Uri(string.Format("{0}/Application/ApplicationPostPhotoFromUser", MyAppSettings.ServerApiUrl));
MyHttpClient.DefaultRequestHeaders.Accept.Clear();
MyHttpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
MyHttpClient.DefaultRequestHeaders.AcceptCharset.Clear();
MyHttpClient.DefaultRequestHeaders.AcceptCharset.Add(new StringWithQualityHeaderValue("utf-8"));
HttpRequestMessage MyWsRequest = new HttpRequestMessage(HttpMethod.Post, MyHttpClient.BaseAddress);
dynamic MyObjData = new JObject();
MyObjData["CatalogItemId"] = catalogItemId;
MyObjData["ObjReferenceId"] = objReferenceId;
MyObjData["UserId"] = string.Empty;
MyObjData["LanguageId"] = languageId;
MyObjData["Picture"] = fileContent;
string MySerializedPostedData = JsonConvert.SerializeObject(MyObjData);
MyWsRequest.Content = new StringContent(MySerializedPostedData, Encoding.UTF8, "application/json");
HttpResponseMessage MyWsResponse = await MyHttpClient.SendAsync(MyWsRequest, HttpCompletionOption.ResponseHeadersRead);
MyWsResponse.EnsureSuccessStatusCode();
var MyContentResponse = await MyWsResponse.Content.ReadAsStringAsync();
MyResponse.ResponseId = MyAppConstants.Constants.ResponseCode.Successfull;
}
catch (Exception ex)
{
MyResponse.ResponseId = MyAppConstants.Constants.ResponseCode.ErrorWhileProcessingRequest;
MyResponse.ResponseErrorMessage = ex.Message;
}
return MyResponse;
}
从堆栈跟踪,
System.Net.WebExceptionStatus.ProtocolError
表示服务器响应了一些 40x 错误,可能是 401(访问被拒绝)或类似的东西。
您可以将您的电话包装在:
try
{
}
catch(WebException ex){
}
然后检查异常 Status 并像这样转换异常的响应:
((HttpWebResponse)e.Response).StatusDescription
获取有关服务器出现问题的更多信息。
编辑:
因为你正在上传大文件,你可以解析"maximum request length exceeded exception",你需要修改你的服务器(例如ASP.NET)web.config文件以接受大请求大小:
<configuration>
<system.web>
<httpRuntime maxRequestLength="50000" />
</system.web>
</configuration>
在我的 Xamarin.Forms 应用程序中,我使用 Json 格式的 HttpClient 将图片和其他字段发送到服务器。 如果我发送一张我用前置摄像头拍摄的小照片,它工作正常,如果我发送一张我用后置摄像头拍摄的更大的照片,它就不起作用,我总是得到一个例外:"Excepional error"。
我尝试在 windows 表单应用程序中创建相同的代码,它也可以很好地处理大图像,但不是来自我的应用程序。
我已经在服务器上修改 web.config 以增加 json 内容大小:
<jsonSerialization maxJsonLength="50000000"/>
有人可以帮忙吗?!谢谢!!
这是我应用程序中的代码:
public async static Task<MyAppDataModels.Common.WsResponse> PostPhotoFromUser(int catalogItemId, int objReferenceId, int languageId, byte[] fileContent)
{
MyAppDataModels.Common.WsResponse MyResponse = new MyAppDataModels.Common.WsResponse();
try
{
HttpClient MyHttpClient = new HttpClient();
MyHttpClient.Timeout = TimeSpan.FromSeconds(520);
MyHttpClient.BaseAddress = new Uri(string.Format("{0}/Application/ApplicationPostPhotoFromUser", MyAppSettings.ServerApiUrl));
MyHttpClient.DefaultRequestHeaders.Accept.Clear();
MyHttpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
MyHttpClient.DefaultRequestHeaders.AcceptCharset.Clear();
MyHttpClient.DefaultRequestHeaders.AcceptCharset.Add(new StringWithQualityHeaderValue("utf-8"));
HttpRequestMessage MyWsRequest = new HttpRequestMessage(HttpMethod.Post, MyHttpClient.BaseAddress);
dynamic MyObjData = new JObject();
MyObjData["CatalogItemId"] = catalogItemId;
MyObjData["ObjReferenceId"] = objReferenceId;
MyObjData["UserId"] = string.Empty;
MyObjData["LanguageId"] = languageId;
MyObjData["Picture"] = fileContent;
string MySerializedPostedData = JsonConvert.SerializeObject(MyObjData);
MyWsRequest.Content = new StringContent(MySerializedPostedData, Encoding.UTF8, "application/json");
HttpResponseMessage MyWsResponse = await MyHttpClient.SendAsync(MyWsRequest, HttpCompletionOption.ResponseHeadersRead);
MyWsResponse.EnsureSuccessStatusCode();
var MyContentResponse = await MyWsResponse.Content.ReadAsStringAsync();
MyResponse.ResponseId = MyAppConstants.Constants.ResponseCode.Successfull;
}
catch (Exception ex)
{
MyResponse.ResponseId = MyAppConstants.Constants.ResponseCode.ErrorWhileProcessingRequest;
MyResponse.ResponseErrorMessage = ex.Message;
}
return MyResponse;
}
从堆栈跟踪,
System.Net.WebExceptionStatus.ProtocolError
表示服务器响应了一些 40x 错误,可能是 401(访问被拒绝)或类似的东西。
您可以将您的电话包装在:
try
{
}
catch(WebException ex){
}
然后检查异常 Status 并像这样转换异常的响应:
((HttpWebResponse)e.Response).StatusDescription
获取有关服务器出现问题的更多信息。
编辑: 因为你正在上传大文件,你可以解析"maximum request length exceeded exception",你需要修改你的服务器(例如ASP.NET)web.config文件以接受大请求大小:
<configuration>
<system.web>
<httpRuntime maxRequestLength="50000" />
</system.web>
</configuration>