0

文字列投稿データを使用してサーバーから POSTING および GET を実行しましたが、次の WebService があります。

submitFeedback(文字列トークン、文字列件名、文字列本文、バイト [] 写真、バイト [] ビデオ);

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配列を配置できません。どうやってするの?

4

1 に答える 1

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 スレッドでリクエストを行うのは良い考えではないと思います。インターフェイスをブロックし、非同期理論を役に立たなくしているので、それは意味がありません。

于 2013-08-09T17:45:40.847 に答える