Αυτός είναι ο κώδικας που έχω μέχρι στιγμής:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System;
using System.Net.Http;
using System.Web;
using System.Net;
using System.IO;
namespace ConsoleProgram
{
public class Class1
{
private const string URL = "https://sub.domain.com/objects.json?api_key=123";
private const string DATA = @"{""object"":{""name"":""Name""}}";
static void Main(string[] args)
{
Class1.CreateObject();
}
private static void CreateObject()
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL);
request.Method = "POST";
request.ContentType = "application/json";
request.ContentLength = DATA.Length;
StreamWriter requestWriter = new StreamWriter(request.GetRequestStream(), System.Text.Encoding.ASCII);
requestWriter.Write(DATA);
requestWriter.Close();
try {
WebResponse webResponse = request.GetResponse();
Stream webStream = webResponse.GetResponseStream();
StreamReader responseReader = new StreamReader(webStream);
string response = responseReader.ReadToEnd();
Console.Out.WriteLine(response);
responseReader.Close();
} catch (Exception e) {
Console.Out.WriteLine("-----------------");
Console.Out.WriteLine(e.Message);
}
}
}
}
Το πρόβλημα είναι ότι νομίζω ότι το μπλοκ εξαίρεσης ενεργοποιείται (επειδή όταν αφαιρώ το try-catch, λαμβάνω ένα μήνυμα σφάλματος διακομιστή (500). Αλλά δεν βλέπω τις γραμμές Console.Out που έβαλα στο μπλοκ catch.
Το Console:
Το νήμα 'vshost.NotifyLoad' (0x1a20) εξήλθε με κωδικό 0 (0x0).
Το νήμα '<No Name>' (0x1988) εξήλθε με κωδικό 0 (0x0).
Το νήμα 'vshost.LoadReference' (0x1710) εξήλθε με κωδικό 0 (0x0).
'ConsoleApplication1.vshost.exe' (Managed (v4.0.30319)): Φορτώθηκε 'c:\users\l. preston sego iii\documents\visual studio 11\Projects\ConsoleApplication1\ConsoleApplication1\bin\Debug\ConsoleApplication1.exe', Symbols loaded.
'ConsoleApplication1.vshost.exe' (Managed (v4.0.30319)): Φορτώθηκε 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Configuration\v4.0_4.0.0.0.0__b03f5f7f11d50a3a\System.Configuration.dll', Παραλείφθηκε η φόρτωση συμβόλων. Η ενότητα είναι βελτιστοποιημένη και η επιλογή του αποσφαλματωτή 'Just My Code' είναι ενεργοποιημένη.
Εμφανίστηκε μια εξαίρεση πρώτης ευκαιρίας τύπου 'System.Net.WebException' στο αρχείο System.dll
Το νήμα 'vshost.RunParkingWindow' (0x184c) εξήλθε με κωδικό 0 (0x0).
Το νήμα '<No Name>' (0x1810) εξήλθε με κωδικό 0 (0x0).
Το πρόγραμμα '[2780] ConsoleApplication1.vshost.exe: έχει τερματιστεί με κωδικό 0 (0x0).
Το πρόγραμμα '[2780] ConsoleApplication1.vshost.exe: Διαχειριζόμενο (v4.0.30319)' εξήλθε με κωδικό 0 (0x0).
Χρησιμοποιώ το Visual Studio 2011 Beta και το .NET 4.5 Beta.
Η πρότασή μου θα ήταν να χρησιμοποιήσετε το RestSharp. Μπορείτε να πραγματοποιήσετε κλήσεις σε υπηρεσίες REST και να τις μετατρέψετε σε αντικείμενα POCO με πολύ λίγο κώδικα για να χρειαστεί να αναλύσετε την απόκριση. Αυτό δεν θα λύσει το συγκεκριμένο σφάλμα σας, αλλά απαντά στο γενικότερο ερώτημά σας για το πώς να κάνετε κλήσεις σε υπηρεσίες REST. Το να χρειαστεί να αλλάξετε τον κώδικά σας για να το χρησιμοποιήσετε θα αποδώσει στην ευκολία χρήσης και την ευρωστία που θα έχετε στο μέλλον. Αυτά είναι απλώς τα 2 σεντς μου.
Σίγουρα δεν σχετίζεται με το θέμα, αλλά τυλίξτε τα αντικείμενα IDisposable
σε μπλοκ using
για να εξασφαλίσετε την κατάλληλη απόρριψη:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System;
using System.Web;
using System.Net;
using System.IO;
namespace ConsoleProgram
{
public class Class1
{
private const string URL = "https://sub.domain.com/objects.json?api_key=123";
private const string DATA = @"{""object"":{""name"":""Name""}}";
static void Main(string[] args)
{
Class1.CreateObject();
}
private static void CreateObject()
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL);
request.Method = "POST";
request.ContentType = "application/json";
request.ContentLength = DATA.Length;
using (Stream webStream = request.GetRequestStream())
using (StreamWriter requestWriter = new StreamWriter(webStream, System.Text.Encoding.ASCII))
{
requestWriter.Write(DATA);
}
try
{
WebResponse webResponse = request.GetResponse();
using (Stream webStream = webResponse.GetResponseStream() ?? Stream.Null)
using (StreamReader responseReader = new StreamReader(webStream))
{
string response = responseReader.ReadToEnd();
Console.Out.WriteLine(response);
}
}
catch (Exception e)
{
Console.Out.WriteLine("-----------------");
Console.Out.WriteLine(e.Message);
}
}
}
}
Εφόσον χρησιμοποιείτε το Visual Studio 11 Beta, θα θέλετε να χρησιμοποιήσετε την τελευταία και καλύτερη έκδοση. Το νέο Web Api περιέχει κλάσεις για αυτό.
Βλέπε HttpClient: http://wcf.codeplex.com/wikipage?title=WCF%20HTTP