Ce que je devais faire était de créer un proxy. La demande de domaine croisé ne fonctionne qu'avec le verbe GET et pas avec POST. Toute ma demande passe par le proxy, et si c'est un POST, alors il agit comme un proxy typique. Si la requête utilise un GET, je dois le convertir en POST. (Je spécifie POST comme le verbe dans mes contrats de service).
Du côté client, j'utilise la fonctionnalité josnp (json avec remplissage) de JQuery pour ajouter les informations correctes à la chaîne de requête.
private static readonly Properties.Settings settings = new Properties.Settings();
public void ProcessRequest(HttpContext context)
{
try
{
string wcfAddress = context.Request.QueryString["WcfAddress"];
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(settings.WCFAddress + wcfAddress);
request.ContentType = "application/json";
request.Method = "POST";
if (context.Request.RequestType == "GET")
{
string callback = context.Request.QueryString["callback"];
string qs = context.Request.QueryString[null];
byte[] body = body = Encoding.UTF8.GetBytes(qs);
request.ContentLength = body.Length;
request.GetRequestStream().Write(body, 0, body.Length);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8))
{
string contents = reader.ReadToEnd();
contents = callback + "(" + contents + ");";
context.Response.ContentType = "application/json";
context.Response.Write(contents);
response.Close();
reader.Close();
}
}
else if (context.Request.RequestType == "POST")
{
byte[] body = new byte[context.Request.ContentLength];
context.Request.InputStream.Read(body, 0, body.Length);
request.ContentLength = body.Length;
request.GetRequestStream().Write(body, 0, body.Length);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8))
{
string contents = reader.ReadToEnd();
context.Response.ContentType = "application/json";
context.Response.Write(contents);
response.Close();
reader.Close();
}
}
}
catch (Exception ex)
{
System.Diagnostics.Trace.WriteLine(ex.ToString());
}
}