2013-07-30 88 views
1

我在Win8上有一个使用VS2012创建的WCF服务。如果我通过VS(localhost:port)启动服务,我可以执行GET和POST。当我在同一台机器上部署到IIS时,只有GET工作。 POST返回404 Not Found。我尝试通过从我的默认网站创建应用程序以及使用VS发布,直接部署到IIS。WCF REST服务POST返回404在IIS上找不到

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

POST请求报头:PostData.xml的含量低于

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

回答

2

我发现这个问题。应用程序的IIS请求筛选将POST设置为不允许。

+1

你是怎么做到的?你在哪里修复它? –

+0

不完全一样,我只是不得不添加POST,因为那里什么也没有。在下一个错误 – Popo

0

你的代码适用于POST和GET,虽然我有VS 2010和IIS 7,但我看不出有什么问题。我在网站下发布服务作为应用程序(POSTDataIssue)。 我使用fiddler首先测试GET请求(URL - http:// localhost:82/POSTDataIssue/RestServiceImpl.svc/json/5),并给出了预期的结果。

然后我尝试了POST,以下内容到http://本地主机: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

您从POST收到的回复是什么? – Vincent

+0

已编辑帖子以显示回复。 – vibhu