Questo è il codice che ho finora:
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);
}
}
}
}
Il problema è che penso che il blocco di eccezione venga attivato (perché quando rimuovo il try-catch, ottengo un messaggio di errore del server (500). Ma non vedo le linee Console.Out che ho messo nel blocco catch.
La mia Console:
``nessuno
Il thread 'vshost.NotifyLoad' (0x1a20) è uscito con codice 0 (0x0).
Il thread '
Sto usando Visual Studio 2011 Beta, e .NET 4.5 Beta.
Il mio suggerimento sarebbe di usare RestSharp. È possibile effettuare chiamate a servizi REST e farli lanciare in oggetti POCO con pochissimo codice boilerplate per dover effettivamente analizzare la risposta. Questo non risolverà il tuo particolare errore, ma risponde alla tua domanda generale su come fare chiamate a servizi REST. Dover cambiare il tuo codice per usarlo dovrebbe ripagarti in termini di facilità d'uso e robustezza andando avanti. Questi sono solo i miei 2 centesimi
Non collegato, ne sono sicuro, ma avvolgete i vostri oggetti IDisposable
in blocchi using
per assicurare un corretto smaltimento:
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);
}
}
}
}
Dato che state usando Visual Studio 11 Beta, vorrete usare l'ultimo e il più grande. La nuova Web Api contiene classi per questo.
Vedere HttpClient: http://wcf.codeplex.com/wikipage?title=WCF%20HTTP