WCF JavaScript кросс-домен - PullRequest
0 голосов
/ 04 мая 2011

Я новичок в javascript, и у меня есть проблема, которая доставляет мне трудные времена.

Я хочу добавить на страницу отслеживание JavaScript. Этот сценарий вызовет службу wcf для отслеживания информации браузера клиента, посещенной страницы и отметки времени. Проблема в том, что я получаю сообщение об ошибке «Метод 405 не разрешен» при вызове JavaScript. Сервис будет находиться в другом домене. Теперь я проверяю это на localhost. Сервис работает нормально, потому что я могу позвонить с новой страницы в браузере. Вы испытывали ту же проблему? Как я могу это исправить?

Мой код JavaScript:

Код сервиса Wcf:

[ServiceContract(Name = "CustomersAssistantService", Namespace = "CustomersAssistantService")]
public interface ICustomersAssistantService
{
    [OperationContract]
    [WebGet]
    string DoWork();

    [WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json)]
    [OperationContract]
    string Sum(int n1, int n2);
}

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class CustomersAssistantService : ICustomersAssistantService
{
    public string DoWork()
    {
        return "work done";
    }

    public string Sum(int n1, int n2)
    {
        return (n1 + n2).ToString();
    }
}

вызов Javascript:

function CallWcf1(){
        var _I = this;
        var url = "http://localhost:58399/CustomersAssistantService.svc/customersAssistantService/";        

            var methodUrl = _I.serviceUrl + 'dowork';

             $.ajax( {
                        url: methodUrl,
                        data: '',
                        type: "GET",
                        processData: false,
                        contentType: "application/json",
                        timeout: 10000,
                        dataType: "text",  // not "json" we'll parse
                        success: 
                        function(res) 
                        {                                    
                            if (!callback) return;
                            // *** Use json library so we can fix up MS AJAX dates
                            var result = JSON2.parse(res);
                            // *** Bare message IS result
                            if (bare)
                            { callback(result); return; }
                            // *** Wrapped message contains top level object node
                            // *** strip it off
                            for(var property in result)
                            {
                                callback( result[property] );
                                break;
                            }                    
                        },
                        error:  
                        function(xhr)
                        {
                            if (!error) return;
                            if (xhr.responseText)
                            {
                                var err = JSON2.parse(xhr.responseText);
                                if (err)
                                    error(err); 
                                else    
                                    error( { Message: "Unknown server error." })
                            }
                            return;
                        }
                    });   
    }

Я что-то не так делаю?

Большое спасибо, Раду D

Ответы [ 2 ]

1 голос
/ 04 мая 2011

Вы сталкиваетесь с той же политикой происхождения . Запросы Ajax ограничены разговором с того же источника ; междоменные запросы обычно отклоняются.

В зависимости от ваших потребностей, существуют различные подходы:

  • Если ваши пользователи будут использовать только современные браузеры (не IE7), вы можете внедрить Cross Origin Resource Sharing на вашем сервере. Это стандарт от W3C, который позволяет серверу открывать доступ к своим ресурсам из разных источников, но поддерживается только в современных браузерах. (А в IE это поддерживается, но не через обычный объект XMLHttpRequest; вместо этого вы должны использовать объект XDomainRequest.)
  • Вы можете реализовать интерфейс JSON-P .
  • Если все, что вы хотите сделать, это отправить уведомление в другой домен, вы можете просто загрузить из него ресурс (img, script и т. Д.), Добавив эти элементы с соответствующим атрибутом src ; это означает, однако, что вы ограничены использованием метода GET, который предназначен для идемпотентных ресурсов.
0 голосов
/ 04 мая 2011

Насколько я знаю, запрос для WCF должен использовать метод POST, поэтому измените на:

type: "POST", 

В вызове AJAX.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...