Кросс-домен JSON включен WCF - PullRequest
0 голосов
/ 19 ноября 2008

У меня есть служба WCF, украшенная атрибутами WebInvoke и привязкой WebHttp для включения JSON. Доступ к сервису возможен из JavaScript, пока мы не попытаемся заставить его работать между доменами. Можете ли вы порекомендовать, как заставить это работать кросс-домен?

Мы пытались создать прокси-веб-обработчик, но он выдает «Bad Request» каждый раз, когда WebHttpRequest пытается получить к нему доступ.

Ответы [ 3 ]

0 голосов
/ 29 августа 2011

Выполните шаги, описанные в Часть 1-4 из этой превосходной серии статей , и вы получите чистый раствор. Я использую его в производстве без проблем.

Вы должны сделать одну настройку, чтобы она работала со всеми браузерами. В CorsDispatchMessageInspector.BeforeSendReply закомментируйте чек:

if (state.Message! = Null)

в противном случае заголовки «Разрешить» применяются только к предполетным запросам, но не к фактическому запросу.

0 голосов
/ 24 июня 2016

Для решения проблемы сделайте следующее

Создайте Global.asax и добавьте следующий код для включения междоменного домена Ajax POST

 public void Application_BeginRequest(object sender, EventArgs e)
        {
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST,OPTIONS");

            if ((HttpContext.Current.Request.HttpMethod == "OPTIONS"))
            {

                HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept");
                HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000");
                HttpContext.Current.Response.End();
            }
        }
    }
0 голосов
/ 02 февраля 2009

Что мне нужно было сделать, это создать прокси. Междоменный запрос работает только с глаголом 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());
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...