Android 使用MvxMultiPartFormRestRequest将图像/数据发布到API控制器时出错
我正在构建一个Android应用程序,它有一个表单,用户可以发布项目的图像。 因此post数据是一个整型字段和一个图像 我使用MvvmCross网络插件发布,并得到以下错误。我是一个初学者,我不知道我哪里做错了:移动应用程序代码还是API控制器代码Android 使用MvxMultiPartFormRestRequest将图像/数据发布到API控制器时出错,android,mvvmcross,asp.net-apicontroller,Android,Mvvmcross,Asp.net Apicontroller,我正在构建一个Android应用程序,它有一个表单,用户可以发布项目的图像。 因此post数据是一个整型字段和一个图像 我使用MvvmCross网络插件发布,并得到以下错误。我是一个初学者,我不知道我哪里做错了:移动应用程序代码还是API控制器代码 error = {System.Net.WebException: The remote server returned an error: (500) Internal Server Error. at System.Net.HttpWebRe
error = {System.Net.WebException: The remote server returned an error: (500) Internal Server Error.
at System.Net.HttpWebRequest.CheckFinalStatus (System.Net.WebAsyncResult result) [0x00000] in <filename unknown>:0
at System.Net.HttpWebRequest.SetResponseData ...
然后单击提交按钮
private void btnSubmit_Click(object sender, EventArgs e)
{
MemoryStream stream = new MemoryStream();
ContentResolver.OpenInputStream(_imgUri).CopyTo(stream);
_vm.Submit(_imgPath, _contentType, stream);
}
这是提交功能:
public void Submit(string fileName, string contentType, MemoryStream stream) {
//Post data
int itemId = 1;
List<MvxMultiPartFormRestRequest.IStreamForUpload> streams = new List<MvxMultiPartFormRestRequest.IStreamForUpload>();
streams.Add(new MvxMultiPartFormRestRequest.MemoryStreamForUpload("userFile", fileName, contentType, stream));
var client = Mvx.Resolve<IMvxJsonRestClient>();
var r = new MvxMultiPartFormRestRequest("https://.../api/ItemUserImage");
r.FieldsToSend.Add("itemId", itemId.ToString());
r.StreamsToSend.AddRange(streams);
client.MakeRequestFor<MyResponse>(r, (result) =>
{
Mvx.Resolve<IUserInteraction>().Alert(result.Result.ResponseText, null, TitleInformation);
}, (error) =>
{
//I met error here
});
public void Submit(字符串文件名、字符串内容类型、内存流){
//发布数据
int itemId=1;
列表流=新列表();
添加(新的MvxMultiPartFormRestRequest.MemoryStreamForUpload(“用户文件”,文件名,内容类型,流));
var client=Mvx.Resolve();
var r=新的MvxMultiPartFormRestRequest(“https://.../api/ItemUserImage");
r、 FieldsToSend.Add(“itemId”,itemId.ToString());
r、 StreamsToSend.AddRange(流);
client.MakeRequestFor(r,(结果)=>
{
Mvx.Resolve().Alert(result.result.ResponseText,null,TitleInformation);
},(错误)=>
{
//我在这里遇到了错误
});
这是我的API控制器:
public class ItemUserImageController : ApiController
{
public async Task<HttpResponseMessage> PostFormData()
{
Response response = new Response();
response.ResponseCode = 1;
response.ResponseText = "step0-";
// Check if the request contains multipart/form-data.
if (!Request.Content.IsMimeMultipartContent())
{
response.ResponseText += "step1-";
throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
}
response.ResponseText += "step2-";
string root = HttpContext.Current.Server.MapPath("~/App_Data");
var provider = new MultipartFormDataStreamProvider(root);
response.ResponseText += "step3-";
try
{
// Read the form data.
await Request.Content.ReadAsMultipartAsync(provider);
response.ResponseText += "step4-";
foreach (var key in provider.FormData.AllKeys)
{
foreach (var val in provider.FormData.GetValues(key))
{
response.ResponseText += string.Format("{0}: {1}-", key, val);
}
}
response.ResponseText += "step5-";
// This illustrates how to get the file names.
foreach (MultipartFileData file in provider.FileData)
{
response.ResponseText += string.Format("{0} - Server file path: {1}-", file.Headers.ContentDisposition.FileName, file.LocalFileName);
}
return Request.CreateResponse(HttpStatusCode.OK, response);
}
catch (System.Exception e)
{
return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, response.ResponseText ,e);
}
}
}
公共类ItemUserImageController:ApicController
{
公共异步任务PostFormData()
{
响应=新响应();
response.ResponseCode=1;
response.ResponseText=“步骤0-”;
//检查请求是否包含多部分/表单数据。
如果(!Request.Content.IsMimeMultipartContent())
{
response.ResponseText+=“步骤1-”;
抛出新的HttpResponseException(HttpStatusCode.UnsupportedMediaType);
}
response.ResponseText+=“步骤2-”;
string root=HttpContext.Current.Server.MapPath(“~/App_Data”);
var provider=新的MultipartFormDataStreamProvider(根);
response.ResponseText+=“步骤3-”;
尝试
{
//读取表单数据。
wait Request.Content.ReadAsMultipartAsync(提供程序);
response.ResponseText+=“步骤4-”;
foreach(provider.FormData.AllKeys中的var键)
{
foreach(provider.FormData.GetValues(键)中的var val)
{
response.ResponseText+=string.Format(“{0}:{1}-”,key,val);
}
}
response.ResponseText+=“步骤5-”;
//这说明了如何获取文件名。
foreach(provider.FileData中的MultipartFileData文件)
{
response.ResponseText+=string.Format(“{0}-服务器文件路径:{1}-”,file.Headers.ContentDisposition.FileName,file.LocalFileName);
}
返回Request.CreateResponse(HttpStatusCode.OK,response);
}
捕获(System.e例外)
{
返回Request.CreateErrorResponse(HttpStatusCode.InternalServerError,response.ResponseText,e);
}
}
}
请帮助。谢谢。这个“错误”可能有很多。解决它的最好方法是使用一些调试工具,在客户端和ASP.Net应用程序中设置断点,并查看通信情况
- 要在客户端应用程序中设置断点,请使用Visual或Xamarin Studio
- 要查看客户端应用程序和服务器之间的原始HTTP流量,请使用Fiddler-see(假设您有4.4或更高版本的Android设备)
- 要在服务器应用程序中设置断点,请使用Visual Studio,并尝试使用IISExpress设置在本地主机之外的开发框中公开网站-请参阅
除此之外,我在查看您的客户机代码时发现的唯一一个“蜘蛛感觉刺痛”是有点担心您可能需要将
内存流中的当前位置重新设置回开始位置(但我还没有完全考虑到这一点).你能用更多信息编辑这个问题吗?你的流是什么?你在服务器上看到了什么错误=a 500表示它正在某个地方抛出异常-异常是什么以及从哪里抛出的?你能单步通过ASP.Net控制器操作来找到关于这个问题的更多细节吗?@Stuart我包括了我的流代码。我是从真实url连接到API控制器。我不知道如何连接到localhost API控制器进行调试。因此,我将消息添加到API控制器的错误响应中:Request.CreateErrorResponse(HttpStatusCode.InternalServerError,response.ResponseText,e),希望获得有关步骤的更多信息,但收到的错误仍然相同。谢谢@stuart,我将尝试调试。
public class ItemUserImageController : ApiController
{
public async Task<HttpResponseMessage> PostFormData()
{
Response response = new Response();
response.ResponseCode = 1;
response.ResponseText = "step0-";
// Check if the request contains multipart/form-data.
if (!Request.Content.IsMimeMultipartContent())
{
response.ResponseText += "step1-";
throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
}
response.ResponseText += "step2-";
string root = HttpContext.Current.Server.MapPath("~/App_Data");
var provider = new MultipartFormDataStreamProvider(root);
response.ResponseText += "step3-";
try
{
// Read the form data.
await Request.Content.ReadAsMultipartAsync(provider);
response.ResponseText += "step4-";
foreach (var key in provider.FormData.AllKeys)
{
foreach (var val in provider.FormData.GetValues(key))
{
response.ResponseText += string.Format("{0}: {1}-", key, val);
}
}
response.ResponseText += "step5-";
// This illustrates how to get the file names.
foreach (MultipartFileData file in provider.FileData)
{
response.ResponseText += string.Format("{0} - Server file path: {1}-", file.Headers.ContentDisposition.FileName, file.LocalFileName);
}
return Request.CreateResponse(HttpStatusCode.OK, response);
}
catch (System.Exception e)
{
return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, response.ResponseText ,e);
}
}
}