Xamarin发布未使其成为api

时间:2018-11-01 10:22:50

标签: c# ios xamarin

您好,我的xamarin帖子未传递到我的其余api。我一直收到“发送请求时发生错误”的所有其他帖子,但并非所有。登录和获取数据时,我已经设置了网络权限。任何帮助都会很棒。下面是一个代码片段。

public async Task<string> PostChecklist(string json)
{
    try
    {
        JToken rootObject = JObject.Parse(json);
        HttpClient httpClient = new HttpClient();
        MultipartFormDataContent multipartContent = new MultipartFormDataContent();

        httpClient.DefaultRequestHeaders.Add("Authorization", "Bearer " + TokenId);
        httpClient.DefaultRequestHeaders.Add("Accept", "application/json");

        string sFile = (string)rootObject["Answers"]["Signature"];
        //Get file
        if (!File.Exists((string)rootObject["Answers"]["Signature"]))
        {
            return "no signature found";
        }
        FileStream fs = File.OpenRead((string)rootObject["Answers"]["Signature"]);
        StreamContent streamContent = new StreamContent(fs);
        streamContent.Headers.Add("Content-Type", "application/octet-stream");
        multipartContent.Add(streamContent, "signature", "signature.png");
        #region Upload images
        JToken jobectImages = rootObject["Images"];

        foreach (var item in jobectImages)
        {
            foreach (var internalitem in item)
            {
                foreach (var imageGroup in internalitem)
                {
                    foreach (JObject image in imageGroup)
                    {
                        JToken tokenName, tokenFileName;

                        image.TryGetValue("FileName", out tokenName);
                        image.TryGetValue("FilePath", out tokenFileName);

                        string FileName = tokenName.ToString();
                        string FilePath = tokenFileName.ToString();

                        //Get file
                        FileStream fs2 = File.OpenRead(FilePath);
                        StreamContent streamContent2 = new StreamContent(fs);
                        streamContent2.Headers.Add("Content-Type", "application/octet-stream");
                        multipartContent.Add(streamContent2, FileName, FileName);
                    }
                }
            }
        }
        #endregion

        var contentJson = new StringContent(json);
        contentJson.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
        {
            Name = "JSONString"
        };

        var contentLong = new StringContent("26");
        contentLong.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
        {
            Name = "Long"
        };

        var contentLat = new StringContent("96");
        contentLat.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
        {
            Name = "Lat"
        };

        multipartContent.Add(contentJson);
        multipartContent.Add(contentLong);
        multipartContent.Add(contentLat);

        var response = await httpClient.PostAsync(GlobalVariables.url + "/checkurl/answers/v12", multipartContent).ConfigureAwait(false);
        if (response.IsSuccessStatusCode)
        {
            Information = await response.Content.ReadAsStringAsync();
            JObject jsonOther = JObject.Parse(Information);
            if(((String)jsonOther["status"]) == "success")
            {
                return "";
            }
            else
            {
                return (String)jsonOther["message"];
            }
        }
        else{
            return "Server Error";
        }
    }
    catch(Exception e)
    {
        return e.ToString();
    }
}

2 个答案:

答案 0 :(得分:0)

很酷尝试附加图像时,我的MultipartFormDataContent似乎出现了问题,如果我不附加图像,它确实可以工作,那么Url帖子就坏了。模拟器无法拍摄图像,所以永远不会出现问题。

答案 1 :(得分:0)

MultipartFormDataContent有一个错误,即如何根据标题和正文的添加顺序生成请求内容。

例如

StreamContent streamContent = new StreamContent(fs);
streamContent.Headers.Add("Content-Type", "application/octet-stream");
multipartContent.Add(streamContent, "signature", "signature.png");

将导致在内容处理标头之前添加内容类型标头

-----------------------------some boundary value here
Content-Type: application/octet-stream
Content-Disposition: form-data; name=signature; filename=signature.png

已知会导致某些服务器如何读取请求的正文/内容

相反,请务必先设置内容成分标题,并确保名称和文件名在将其添加到多部分表单数据内容中之前用双引号引起来

StreamContent streamContent = new StreamContent(fs);
streamContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data") {
    Name = "\"signature\"",
    Filename = "\"signature.png\""
};
streamContent.Headers.Add("Content-Type", "application/octet-stream");
multipartContent.Add(streamContent);

添加图像的其他部分也需要这样做

//Get file
FileStream fs2 = File.OpenRead(FilePath);
StreamContent streamContent2 = new StreamContent(fs);
streamContent2.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data") {
    Name = string.Format("\"{0}\"", FileName),
    Filename = string.Format("\"{0}\"", FileName),
};
streamContent2.Headers.Add("Content-Type", "application/octet-stream");
multipartContent.Add(streamContent2);