2013-07-30 1 views
1

J'ai un service WCF créé avec VS2012 sur Win8. Si je démarre le service via VS (localhost: port), je suis capable de faire des GET et des POST. Lorsque je déploie sur IIS sur la même machine, seul GET fonctionne. Le retour POST 404 non trouvé. J'ai essayé de déployer directement sur IIS en créant une application à partir de mon site Web par défaut et en utilisant VS Publish.Service REST WCF POST renvoie 404 introuvable sur IIS

URL POST: http://www.server.com/RestService/RestServiceImpl.svc/auth

POST Demande d'en-tête: contenu de PostData.xml ci-dessous

Web.config:

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 

<system.web> 
    <compilation debug="true" targetFramework="4.0" /> 
    <customErrors mode="Off"/> 
</system.web> 

<system.serviceModel> 
    <services> 
     <service name="RestService.RestServiceImpl" behaviorConfiguration="ServiceBehaviour"> 
      <!-- Service Endpoints --> 
      <!-- Unless fully qualified, address is relative to base address supplied above --> 
      <endpoint address="" binding="webHttpBinding" contract="RestService.IRestServiceImpl" behaviorConfiguration="RestServiceImplEndpointBehavior"> 
       <!-- Upon deployment, the following identity element should be removed or replaced to reflect the 
        identity under which the deployed service runs. If removed, WCF will infer an appropriate identity automatically. --> 
      </endpoint> 
     </service> 
    </services> 

    <behaviors> 
     <serviceBehaviors> 
      <behavior name="ServiceBehaviour"> 
       <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment --> 
       <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" /> 
       <!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information --> 
       <serviceDebug includeExceptionDetailInFaults="true" /> 
      </behavior> 
     </serviceBehaviors> 
     <endpointBehaviors> 
      <behavior name="RestServiceImplEndpointBehavior"> 
       <webHttp /> 
      </behavior> 
     </endpointBehaviors> 
    </behaviors> 

    <serviceHostingEnvironment multipleSiteBindingsEnabled="true"/> 
    </system.serviceModel> 

    <system.webServer> 
     <modules runAllManagedModulesForAllRequests="true" /> 
     <directoryBrowse enabled="true" /> 
    </system.webServer> 

    <system.diagnostics> 
     <sources> 
      <source name="System.ServiceModel" 
       switchValue="Information, ActivityTracing" 
       propagateActivity="true"> 
       <listeners> 
        <add name="traceListener" 
         type="System.Diagnostics.XmlWriterTraceListener" 
         initializeData= "c:\log\Traces.svclog" /> 
       </listeners> 
      </source> 
     </sources> 
    </system.diagnostics> 
</configuration> 

iRestServerImpl.cs:

using System.ServiceModel; 
using System.ServiceModel.Web; 

namespace RestService 
{ 

    [ServiceContract] 
    public interface IRestServiceImpl 
    { 
     [OperationContract] 
     [WebInvoke(Method = "GET", 
      ResponseFormat = WebMessageFormat.Xml, 
      BodyStyle = WebMessageBodyStyle.Wrapped, 
      UriTemplate = "xml/{id}")] 
     string XMLData(string id); 

     [OperationContract] 
     [WebInvoke(Method = "GET", 
      ResponseFormat = WebMessageFormat.Json, 
      BodyStyle = WebMessageBodyStyle.Wrapped, 
      UriTemplate = "json/{id}")] 
     string JSONData(string id); 

     [OperationContract] 
     [WebInvoke(Method = "POST", 
      ResponseFormat = WebMessageFormat.Xml, 
      RequestFormat = WebMessageFormat.Xml, 
      BodyStyle = WebMessageBodyStyle.Bare, 
      UriTemplate = "auth")] 
     ResponseData Auth(RequestData rData); 

    } 
} 

RestServiceImpl. svc

<%@ ServiceHost Language="C#" Debug="true" Service="RestService.RestServiceImpl" CodeBehind="RestServiceImpl.svc.cs" %> 

RestServiceImpl.svc.cs

namespace RestService 
{ 
    public class RestServiceImpl : IRestServiceImpl 
    { 
     #region IRestServiceImpl Members 

     public string XMLData(string id) 
     { 
      return "You requested product " + id; 
     } 

     public string JSONData(string id) 
     { 
      return "You requested product " + id; 
     } 

     public ResponseData Auth(RequestData rData) 
     { 
      // Call BLL here 
      var data = rData.details.Split('|'); 
      var response = new ResponseData 
           { 
            Name = data[0], 
            Age = data[1], 
            Exp = data[2], 
            Technology = data[3] 
           }; 

      return response; 
     } 

     #endregion 




    } 
} 

RequestData.cs

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Runtime.Serialization; 
using System.Text; 

namespace RestService 
{ 
    [DataContract(Namespace = "http://www.eysnap.com/mPlayer")] 
    public class RequestData 
    { 
     [DataMember] 
     public string details { get; set; } 
    } 
} 

ResponseData.cs

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Runtime.Serialization; 
using System.Web; 

namespace RestService 
{ 
    [DataContract] 
    public class ResponseData 
    { 
     [DataMember] 
     public string Name { get; set; } 

     [DataMember] 
     public string Age { get; set; } 

     [DataMember] 
     public string Exp { get; set; } 

     [DataMember] 
     public string Technology { get; set; } 
    } 
} 

PostData.xml

<RequestData xmlns="http://www.eysnap.com/mPlayer"> 
    <details>Ashu|29|7 Years|.NET</details> 
</RequestData> 

Répondre

2

J'ai trouvé le problème. Le filtrage des demandes IIS pour l'application a été défini sur POST comme non autorisé.

+1

Comment avez-vous fait? Où l'avez-vous réparé? –

+0

Pas tout à fait la même chose, j'ai juste dû ajouter POST, puisqu'il n'y avait rien là. Sur l'erreur suivante – Popo

0

Votre code fonctionne bien pour POST et GET, même si j'ai VS 2010 et IIS 7, mais je n'y vois aucun problème. J'ai publié un service en tant qu'application (POSTDataIssue) sous un site Web. J'ai utilisé fiddler pour tester d'abord la requête GET (URL - http: // localhost: 82/POSTDataIssue/RestServiceImpl.svc/json/5) et elle a donné le résultat attendu.

Alors j'ai essayé POST avec le contenu suivant à l'URL http: // localhost: 82/POSTDataIssue/RestServiceImpl.svc/Auth-

User-Agent: Fiddler 
Host: localhost:82 
Content-Type: application/xml 
Content-Length: 110 


<RequestData xmlns="http://www.eysnap.com/mPlayer"> 
<details>Ashu|29|7 Years|.NET</details> 
</RequestData> 



Response 
HTTP/1.1 200 OK 
Content-Length: 218 
Content-Type: application/xml; charset=utf-8 
Server: Microsoft-IIS/7.5 
X-Powered-By: ASP.NET 
Date: Thu, 01 Aug 2013 02:34:58 GMT 

<ResponseData xmlns="http://schemas.datacontract.org/2004/07/RestService" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><Age>29</Age><Exp>7 Years</Exp><Name>Ashu</Name><Technology>.NET</Technology></ResponseData> 
+1

Quelle a été la réponse que vous avez reçue du POST? – Vincent

+0

modifié pour afficher la réponse. – vibhu

Questions connexes