1

ここで見つけたコードの一部を使用して、サーバーに画像をPOSTしています。問題は、本来あるべきJson応答を受信して​​いないことです。代わりに、「ResponseReady」コールバックで古いSERVERNOTFOUND応答を取得しています。(編集:それは私のパラメーターであることがわかりました。このコードは完全に正常に機能します。)

これが私がPOSTを作成するために使用しているクラスです

    public class PostSubmitter
    {

       public string url { get; set; }
       public Dictionary<string, object> parameters { get; set; }
       string boundary = "----------" + DateTime.Now.Ticks.ToString();
       HttpWebRequest webRequest;

       public void Submit()
       {
           // Prepare web request...
           webRequest = WebRequest.CreateHttp(url);
           webRequest.Method = "POST";
           webRequest.ContentType = string.Format("multipart/form-data; boundary={0}", boundary);
           webRequest.BeginGetRequestStream(new AsyncCallback(RequestReady), webRequest);

       }

       private void RequestReady(IAsyncResult asynchronousResult)
       {
           using (Stream postStream = webRequest.EndGetRequestStream(asynchronousResult))
           {
                writeMultipartObject(postStream, parameters);
           }

           webRequest.BeginGetResponse(new AsyncCallback(ResponseReady), webRequest);

       }

       private void ResponseReady(IAsyncResult asynchronousResult)
       {
           try
           {
               using (var response =
                (HttpWebResponse)webRequest.EndGetResponse(asynchronousResult))
               using (var streamResponse = response.GetResponseStream())
               using (var streamRead = new StreamReader(streamResponse))
               {
                   var responseString = streamRead.ReadToEnd();
                   var success = response.StatusCode == HttpStatusCode.OK;

                   if (responseString != null)
                   {
                       //JObject comes from Newtonsoft.Json ddl. This is a good one if your working with json
                       JObject jsonResponse = JObject.Parse(responseString);
                       //Do stuff with json.....
                   }
               }
           }
           catch (Exception e)
           {
               if (e.Message == "The remote server returned an error: NotFound.")
               {
                   webRequest.Abort();
                   Deployment.Current.Dispatcher.BeginInvoke(delegate() { MessageBox.Show("Unable to connect to server at this time, please try again later"); });
               }
               else
                   Deployment.Current.Dispatcher.BeginInvoke(delegate() { MessageBox.Show("Unable to upload photo at this time, please try again later"); });
               return;
           }
       }


       public void writeMultipartObject(Stream stream, object data)
       {
           using (StreamWriter writer = new StreamWriter(stream))
           {
               if (data != null)
               {
                   foreach (var entry in data as Dictionary<string, object>)
                   {
                       WriteEntry(writer, entry.Key, entry.Value);
                   }
               }
               writer.Write("--");
               writer.Write(boundary);
               writer.WriteLine("--");
               writer.Flush();
           }
       }

       private void WriteEntry(StreamWriter writer, string key, object value)
       {
           if (value != null)
           {
               writer.Write("--");
               writer.WriteLine(boundary);
               if (value is byte[])
               {
                   byte[] ba = value as byte[];

                   writer.WriteLine(@"Content-Disposition: form-data; name=""{0}""; filename=""{1}""", key, "sentPhoto.jpg");
                   writer.WriteLine(@"Content-Type: application/octet-stream");
                   writer.WriteLine(@"Content-Type: image / jpeg");
                   writer.WriteLine(@"Content-Length: " + ba.Length);
                   writer.WriteLine();
                   writer.Flush();
                   Stream output = writer.BaseStream;

                   output.Write(ba, 0, ba.Length);
                   output.Flush();
                   writer.WriteLine();
               }
               else
               {
                   writer.WriteLine(@"Content-Disposition: form-data; name=""{0}""", key);
                   writer.WriteLine();
                   writer.WriteLine(value.ToString());
               }
           }
       }
    }

このクラスを使用すると、次のコード行を使用してサーバーに簡単なPOSTを作成できます。

    Dictionary<string, object> postData = new Dictionary<string, object>()
                                                {
                                                    {"file", byteArrayOfImage}
                                                    //You can add other parameters here
                                                };
    PostSubmitter postToServer = new PostSubmitter() { url = getPicturePostUrl(), parameters = postData };
    postToServer.Submit();

これについては非常に多くの質問があります...複雑なWebリクエストを簡単に実行できるようになると思います...。

有益なコメントを事前に感謝するか、質問をしてください。

4

1 に答える 1

1

このコードは実際には完全に機能します。必要なパラメーターの1つがなかったため、サーバーは要求を拒否していました。

于 2012-07-11T21:38:15.640 に答える