Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用MvxMultiPartFormRestRequest将图像/数据发布到API控制器时出错_Android_Mvvmcross_Asp.net Apicontroller - Fatal编程技术网

Android 使用MvxMultiPartFormRestRequest将图像/数据发布到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

我正在构建一个Android应用程序,它有一个表单,用户可以发布项目的图像。 因此post数据是一个整型字段和一个图像

我使用MvvmCross网络插件发布,并得到以下错误。我是一个初学者,我不知道我哪里做错了:移动应用程序代码还是API控制器代码

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