2010-09-10 4 views
3

J'essaie d'appeler une méthode auto-hébergée wcf de jquery mais, je reçois toujours le message: "méthode non autorisée". J'ai trouvé quelques réponses à ce problème sur ce forum mais rien n'a fonctionné pour moi .... ps. Cela fonctionne très bien lorsque j'ajoute la référence sur une application de console et la consomme.wcf self hosting jquery

c'est une forme de fenêtres forme auto-hébergé app

charge:

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> 

contrat d'exploitation:

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

Service:

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); 
    } 
}); 

Répondre

2

Eh bien, votre problème actuel est causé par le fait que WebInvoke, lorsque vous ne spécifiez pas le paramètre Method, sera par défaut "POST". Votre code jQuery émet une requête "GET", l'erreur "méthode non autorisée" est donc attendue.

Cependant, votre commentaire sur essayer GET initialement et ne rien obtenir en retour me fait pencher vers votre problème étant une violation de la same origin policy avec votre navigateur. Étant donné que vous hébergez le service dans un Windows Form avec l'adresse http://localhost:8766, je suppose que votre site Web n'est pas situé à `http://localhost:8766 '. Par la même politique d'origine:

Le terme « origine » est définie en utilisant le protocole nom de domaine , la couche d'application , et (dans la plupart des navigateurs) port TCP du document HTML exécutant le script . Deux ressources sont considérées comme ayant la même origine si et seulement si toutes ces valeurs sont exactement identiques à .

Si vous renvoyez des données de votre service au format JSON, vous pouvez envisager d'utiliser une requête GET renvoyant JSONP. Ce type de requête ne viole pas la même règle d'origine que la demande de scripts distants. Votre appel jQuery serait alors ressembler à ceci:

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

Puisque vous utilisez WebInvoke, vous pouvez également utiliser le WebHttpBinding liant au lieu de BasicHttpBinding. WebInvoke ne fonctionne pas sauf s'il est utilisé avec WebHttpBinding. Et lorsque vous utilisez WebHttpBinding, vous pouvez le personnaliser afin qu'il réponde aux demandes JSONP. Donc, votre config ressemblerait à ceci:

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

est ici un très bon blog post que vous les étapes à travers cela.

Espérons que cela aide!