Обаждане до локална 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 заявка, благодарение на M.Babcock, че ме тласна в тази посока (маловажните части са умишлено пропуснати, за да спестят място).

Service.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