wcf сам хостинг jquery - PullRequest
       2

wcf сам хостинг jquery

3 голосов
/ 10 сентября 2010

Я пытаюсь вызвать собственный метод wcf из jquery, но всегда получаю сообщение: «метод не разрешен». Я нашел некоторые ответы на этот вопрос на этом форуме, но ничего не помогло мне .... пс. Он отлично работает, когда я добавляю ссылку на консольное приложение и использую ее.

это приложение для Windows Forms

форма загрузки:

ServiceHost host = new ServiceHost(typeof(MyServices), new Uri[] { });
host.Open();

App.Config

<system.serviceModel>
        <services>
            <service behaviorConfiguration="ServiceConfig" name="MyServices">
                <endpoint address="srv" binding="basicHttpBinding" contract="Operations" />
                <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
                <host>
                    <baseAddresses>
                        <add baseAddress="http://localhost:8766" />
                    </baseAddresses>
                </host>
            </service>
        </services>
        <behaviors>
            <serviceBehaviors>
                <behavior name="ServiceConfig">
                    <serviceMetadata httpGetEnabled="true" />
                </behavior>
            </serviceBehaviors>
        </behaviors>
        <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
    </system.serviceModel>

Операционный договор:

[OperationContract]
[WebInvoke(BodyStyle = WebMessageBodyStyle.WrappedRequest, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
string Test();

Услуги:

public string Test()
{
return "Good!";
}

JQuery

$.ajax({
    url: "http://localhost:8766/Test",
    contentType: "application/json",
    processData: false,
    //data: '{}', // tried passing data
    type: "GET", // tried POST and pass nothing(deleting this param), but nothing...
    success: function (msg) {
        console.log(msg);
    }
});

1 Ответ

2 голосов
/ 11 сентября 2010

Что ж, ваша текущая проблема вызвана тем, что WebInvoke, если вы не укажете параметр Method, по умолчанию будет "POST". Ваш код jQuery отправляет запрос «GET», поэтому можно ожидать ошибку «метод не разрешен».

Тем не менее, ваш комментарий о том, что вы пытаетесь получить GET изначально и ничего не получаете взамен, заставляет меня склониться к вашей проблеме, заключающейся в нарушении политики того же происхождения с вашим браузером. Поскольку вы размещаете службу в форме Windows с адресом http://localhost:8766, я предполагаю, что ваш веб-сайт не находится по адресу http://localhost:8766'. Согласно той же политике происхождения:

Термин «происхождение» определяется с использованием доменное имя, прикладной уровень протокол и (в большинстве браузеров) TCP порт документа HTML, на котором выполняется скрипт. Два ресурса считаются быть того же происхождения, если и только если все эти значения точно то же самое.

Если вы возвращаете данные из своего сервиса в формате JSON, вы можете рассмотреть возможность использования запроса GET, который возвращает JSONP. Этот тип запроса не нарушает ту же политику происхождения, что и разрешенные удаленные сценарии. Ваш вызов jQuery будет выглядеть так:

$.ajax({
    url: "http://localhost:8766/Test",
    dataType: "jsonp",
    processData: false,
    type: "GET",
    success: function (msg) {
        console.log(msg);
    }
});

Поскольку вы используете WebInvoke, вы также можете использовать привязку WebHttpBinding вместо BasicHttpBinding. WebInvoke не работает, если не используется с WebHttpBinding. А когда вы используете WebHttpBinding, вы можете настроить его так, чтобы он отвечал на запросы JSONP. Итак, ваш конфиг будет выглядеть так:

<system.serviceModel>
    <bindings>
        <webHttpBinding>
            <binding name="webHttpBindingWithJsonP" crossDomainScriptAccessEnabled="true" />
        </webHttpBinding>
    </bindings>
    <behaviors>
        <endpointBehaviors>
          <behavior name="webHttpBehavior">
            <webHttp />
          </behavior>
        </endpointBehaviors>
    </behaviors>
    <services>
        <service behaviorConfiguration="ServiceConfig" name="MyServices">
            <endpoint address="srv" binding="webHttpBinding" contract="Operations" bindingConfiguration="webHttpBindingWithJsonP" behaviorConfiguration="webHttpBehavior" />
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
            <host>
                <baseAddresses>
                    <add baseAddress="http://localhost:8766" />
                </baseAddresses>
            </host>
        </service>
    </services>
    <behaviors>
        <serviceBehaviors>
            <behavior name="ServiceConfig">
                <serviceMetadata httpGetEnabled="true" />
            </behavior>
        </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
</system.serviceModel>

Вот очень хороший блог пост , который шаг за шагом проходит через это.

Надеюсь, это поможет!

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