使用HttpClient中的MultipartFormDataContent发布数据

时间:2013-05-18 14:53:23

标签: c#

我有一个WebAPI服务,使用

读取包含文件数据的帖子数据
HttpContext.Request as key value pairs
HttpContext.Current.Request["LoadId"]

现在我正在尝试使用HttpClient编写和控制台应用程序,但无法使其正常工作

private static bool AddException(string vin, string loadId, string sessionId)
        {
            var client = new HttpClient
            {
                BaseAddress = new Uri("url")
            };
            ServicePointManager.ServerCertificateValidationCallback = (s, cert, chain, ssl) => true;

            const string quickCode = "01-01-1"; 
            const string inspectionType = "Loading";
            const string inspectorCode = "001";
            const string numberOfImages = "1";
            const string imageNumber = "1";
            const string exceptionType = "Driver";
            const string imageType = "exception";
            var date = DateTime.Now.ToString();

            var content = new MultipartFormDataContent();
            var values = new[]
                    {
                        new KeyValuePair<string, string>("LoadId", loadId),
                        new KeyValuePair<string, string>("VIN", vin),
                        new KeyValuePair<string, string>("SessionId", sessionId),
                        new KeyValuePair<string, string>("QuickCode", quickCode),
                        new KeyValuePair<string, string>("strInspectionType", inspectionType),
                        new KeyValuePair<string, string>("InspectorCode", inspectorCode),
                        new KeyValuePair<string, string>("NoOfImages", numberOfImages),
                        new KeyValuePair<string, string>("Imageno", imageNumber),
                        new KeyValuePair<string, string>("strExceptionType", exceptionType),
                        new KeyValuePair<string, string>("ImageType", imageType),
                        new KeyValuePair<string, string>("DateTimeOffset", date)
                    };
            var fileContent = new ByteArrayContent(File.ReadAllBytes(@"C:\Users\Public\Pictures\Sample Pictures\Desert.jpg"));
            fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
            {
                FileName = "Desert.jpg"
            };
            content.Add(fileContent, "file", "11");

            foreach (var keyValuePair in values)
            {
                content.Add(new StringContent(keyValuePair.Value), keyValuePair.Key);
            }

            var response = client.PostAsync("Exception/AddException", content).Result;
            var exceptionResult = response.Content.ReadAsAsync<bool>().Result;

            return exceptionResult;
        }

以上是代码。但无法从服务中读取代码

我无法控制服务代码而无法更改

1 个答案:

答案 0 :(得分:0)

您是否在Post form data along with files to Web Api2处尝试此代码?您可以合并两个代码块。它对我来说非常好。

Web Api代码读取文件

using System.Diagnostics;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using System.Web;
using System.Web.Http;

public class UploadController : ApiController
{
    public async Task<HttpResponseMessage> PostFormData()
    {
        // Check if the request contains multipart/form-data.
        if (!Request.Content.IsMimeMultipartContent())
        {
            throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
        }

        string root = HttpContext.Current.Server.MapPath("~/App_Data");
        var provider = new MultipartFormDataStreamProvider(root);

        try
        {
            // Read the form data.
            await Request.Content.ReadAsMultipartAsync(provider);

            // This illustrates how to get the file names.
            foreach (MultipartFileData file in provider.FileData)
            {
                Trace.WriteLine(file.Headers.ContentDisposition.FileName);
                Trace.WriteLine("Server file path: " + file.LocalFileName);
            }
            return Request.CreateResponse(HttpStatusCode.OK);
        }
        catch (System.Exception e)
        {
            return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, e);
        }
    }

}

Web Api Code读取表单数据

public async Task<HttpResponseMessage> PostFormData()
{
    if (!Request.Content.IsMimeMultipartContent())
    {
        throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
    }

    string root = HttpContext.Current.Server.MapPath("~/App_Data");
    var provider = new MultipartFormDataStreamProvider(root);

    try
    {
        await Request.Content.ReadAsMultipartAsync(provider);

        // Show all the key-value pairs.
        foreach (var key in provider.FormData.AllKeys)
        {
            foreach (var val in provider.FormData.GetValues(key))
            {
                Trace.WriteLine(string.Format("{0}: {1}", key, val));
            }
        }

        return Request.CreateResponse(HttpStatusCode.OK);
    }
    catch (System.Exception e)
    {
        return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, e);
    }
}