Вызов локальной службы WCF через Scriptish или Greasemonkey

Я пытаюсь предоставить локальную службу WCF, которая проверяет, существует ли в моей базе данных файл, к которому можно получить доступ из сценария Scriptish.

Можно ли вызвать локальный URL-адрес из Scriptish или Greasemonkey (GET или POST)? Я создал службу WCF, размещенную в IIS на моем локальном компьютере, и служба работает нормально. Однако, когда я пытаюсь вызвать службу из Scriptish, вкладка «Сеть» в Chrome/Firefox просто говорит следующее:

Request URL: http://localhost/service/service.svc/MatchPartial
Request Method: OPTIONS
Status code: 405 Method Not Allowed

Вот мой вызов ajax:

$.ajax({
    url: 'http://localhost/service/service.svc/MatchPartial',
    type: 'POST',
    contentType: 'application/json; charset=UTF-8',
    dataType: 'json',
    processData: true,
    data: '{ "partialFilename": "testing" }',
    success: function (result) {
        console.log(result);
    }
});

Мой метод украшен:

[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
public int MatchPartial(string partialFilename)
{
    ...
}

У меня есть следующее выше моего класса обслуживания:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]

Я безуспешно пытался добавить в свой сервис следующее:

[WebInvoke(Method = "OPTIONS", UriTemplate = "*")]
public void GetOptions()
{
    WebOperationContext.Current.OutgoingResponse.Headers.Add("Access-Control-Allow-Origin", "*");
    WebOperationContext.Current.OutgoingResponse.Headers.Add("Access-Control-Allow-Methods", "POST, GET, OPTIONS");
    WebOperationContext.Current.OutgoingResponse.Headers.Add("Access-Control-Allow-Headers", "Content-Type");
}

Я чувствую, что пробовал все. Любая помощь будет оценена по достоинству!


person Jason Willett    schedule 14.09.2013    source источник
comment
Вы пытались использовать действие HTTP GET для своей операции? Будет проще звонить из таких сред.   -  person M.Babcock    schedule 14.09.2013
comment
@ M.Babcock Да, я пытался выполнить GET, но только после того, как вы только что спросили меня, понял ли я, что мой код ajax испорчен для запроса GET. Вот рабочий код: $.get(localhost/service/service.svc/MatchPartial, {partialFilename: тестирование});   -  person Jason Willett    schedule 14.09.2013


Ответы (1)


Я понял, как это сделать с помощью запроса GET, благодаря М. Бэбкоку за то, что он подтолкнул меня в этом направлении (неважные части намеренно опущены для экономии места).

Сервис.svc:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class Service : IService
{
    [WebGet(ResponseFormat = WebMessageFormat.Json)]
    public bool MatchPartial(string partialFilename)
    {
        ...
    }
}

Web.config:

<configuration>
  ...
  ...
  <system.web>
    <compilation debug="true"
                 targetFramework="4.5" />
    <httpRuntime targetFramework="4.5" />
  </system.web>
  <system.webServer>
    <httpProtocol>
      <customHeaders>
        <!-- IMPORTANT FOR THIS TO WORK USING JQUERY GET OR AJAX -->
        <add name="Access-Control-Allow-Origin" 
             value="*" />
      </customHeaders>
    </httpProtocol>
  </system.webServer>
  <system.serviceModel>
    <services>
      <service name="MyNamespace.Services.WCF.Service">
        <endpoint address=""
                  binding="webHttpBinding" 
                  bindingConfiguration=""
                  contract="MyNamespace.Core.Interfaces.IService" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost/Service" />
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="true" />
          <!-- For Debugging --->
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior>
          <webHttp />
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"
                               multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true" />
  </system.webServer>
</configuration>    

Вот как это сделать в Scriptish:

var service = "http://localhost/service/service.svc";

GM_xmlhttpRequest({
    method: "GET",
    url: service + "/MatchPartial?partialFilename=" + filename,
    headers: { "Accept": "application/json" },
    onload: function (result) {
        if (result != null && result.status == 200 && result.responseJSON == true) {
            videoFrame.remove(); 
        }
    },
    onerror: function (res) {
        GM_log("Error!");
    }
});

Обычный jQuery:

$.get("service", { partialFilename: filename }, function (result) {
    if (result == true) {
        videoFrame.remove(); 
    }
});
person Jason Willett    schedule 14.09.2013