0

我正在构建一个 Android 应用程序,该应用程序具有用户可以为项目发布图像的表单。所以 post 数据是一个 int 字段和一个图像。

我使用 MvvmCross Network 插件发布并得到以下错误。我是初学者,我不知道我做错了什么:移动应用程序代码或 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 ...

这是移动应用程序代码:

这是选择图像代码:

    protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
    {
        if ((requestCode == PickImageId) && (resultCode == Result.Ok) && (data != null))
        {
            _imgUri = data.Data;

            _imgPath = GetPathToImage(_imgUri);
            _contentType = ContentResolver.GetType(_imgUri);
        }
    }

然后点击提交按钮

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

这是我的 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);
        }
    }            
}

请帮忙。谢谢你。

4

1 回答 1

0

这个“错误”可能是很多东西。真正解决它的最佳方法是使用一些调试工具进入那里,在客户端和 ASP.Net 应用程序中设置断点并查看通信是什么。

一旦你开始调试这个,我相信你会很快

除此之外,我通过您的客户端代码查看的唯一“蜘蛛感觉刺痛”是您可能需要将当前位置重置为MemoryStream起点的轻微担忧(但我还没有完全考虑到这一点)。

于 2014-11-22T12:46:24.393 回答