将字符串和bytearray发布到服务器

时间:2013-08-09 08:42:22

标签: c# windows-phone-7 windows-phone-8 httpwebrequest

我使用字符串发布数据从服务器完成POSTING和GETing,但现在我有了下一个WebService:

submitFeedback(String token,String subject,String body,byte [] photo,byte [] video);

private void PostFeedbackData()
    {
        if (GS.online != true)
        {
            MessageBox.Show(GS.translations["ErrorMsg0"]);
        }
        else
        {
            HttpWebRequest request = HttpWebRequest.CreateHttp("https://****/feedback");
            request.Method = "POST";
            request.BeginGetRequestStream(new AsyncCallback(GetRequestStreamCallback), request);
        }
    }
    void GetRequestStreamCallback(IAsyncResult callbackResult)
    {
        HttpWebRequest myRequest = (HttpWebRequest)callbackResult.AsyncState;
        // End the stream request operation
        Stream postStream = myRequest.EndGetRequestStream(callbackResult);

        // Create the post data
        string postData = "";

        Deployment.Current.Dispatcher.BeginInvoke(() =>
        {
            postData = "{\"jsonrpc\": \"2.0\", \"method\": \"getUserSchedule\", \"params\":[" + "\"" + (App.Current as App).UserToken + "\",\"" + FeedbackTitle.Text + "\",\"" + FeedbackContent.Text + "\",\"" + imageBytes + "\"], \"id\": 1}";
            byte[] byteArray = Encoding.UTF8.GetBytes(postData);

            // Add the post data to the web request
            postStream.Write(byteArray, 0, byteArray.Length);
            postStream.Close();

            // Start the web request
            myRequest.BeginGetResponse(new AsyncCallback(GetResponsetStreamCallback), myRequest);
        });

    }

查看帖子数据 - 它是一个字符串,我不能放置imageBytes数组。怎么做?

1 个答案:

答案 0 :(得分:0)

有没有理由使用HttpWebRequest?

我问这是因为我认为将文件发送到服务的正确方法是通过多部分数据。使用HttpWebRequest,您必须手动实现它。

以下是使用可能适合您的Microsoft HttpClient的示例:

public async Task<string> submitFeedback(String token, String subject, String body, byte[] photo, byte[] video) {
    var client = new HttpClient();
    var content = new MultipartFormDataContent(); 

    // Some APIs do not support quotes in boundary field
    foreach (var param in content.Headers.ContentType.Parameters.Where(param => param.Name.Equals("boundary")))
        param.Value = param.Value.Replace("\"", String.Empty);

    var tok = new StringContent(token);
    content.Add(tok, "\"token\"");
    var sub = new StringContent(subject);
    content.Add(tok, "\"subject\"");

    // Add the Photo 
    var photoContent = new StreamContent(new MemoryStream(photo));
    photoContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
    {
        Name = "\"photo\"",
        FileName = "\"photoname.jpg\""
    };
    photoContent.Headers.ContentType = MediaTypeHeaderValue.Parse("image/jpeg");
    content.Add(photoContent);

    // Add the video
    var videoContent = new StreamContent(new MemoryStream(video));
    videoContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
    {
        Name = "\"video\"",
        FileName = "\"videoname.jpg\""
    };
    videoContent.Headers.ContentType = MediaTypeHeaderValue.Parse("video/mp4");
    content.Add(videoContent);

    HttpResponseMessage resp;

    try {           
        resp = await client.PostAsync("SERVER_URL_GOES_HERE", content);
    }
    catch (Exception e)
    {
        return "EXCEPTION ERROR";
    }

    if (resp.StatusCode != HttpStatusCode.OK)
    {
        return resp.StatusCode.ToString();
    }

    var reponse = await resp.Content.ReadAsStringAsync();

    return reponse;
}

相应地改变。 注意:HttpClient也在底层使用HttpWebRequest。 我也不认为让UI线程发出请求是个好主意。这是没有意义的,因为你阻止了界面并使异步理论变得毫无用处。