WCF REST服务POST在IIS上返回404 Not Found

时间:2013-07-30 21:17:37

标签: wcf post iis-8

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

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

POST Request Header:下面的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 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

然后我尝试将以下内容发布到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>