Что мне нужно было сделать, это создать прокси. Междоменный запрос работает только с глаголом GET, а не POST. Все мои запросы проходят через прокси, и если это POST, то он действует как обычный прокси. Если запрос использует GET, я должен преобразовать его в POST.
(Я указываю POST как глагол в моих контрактах на обслуживание).
На стороне клиента я использую функциональность JQuery josnp (json with padding) для добавления правильной информации в строку запроса.
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());
}
}