简体   繁体   中英

WCF Rest Webservice - Bad Request in IIS

I'm having a problem with a WCF Rest service when I publish it to IIS. It all works fine with VS, but when run through IIS I keep getting a Bad Request.

Some example code, my service is as simple as this:

[ServiceContract]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
public class Admin
{
    [WebGet(UriTemplate = "Field/GetAll")]
    public IList<EntityFields> GetFields() ...

I have added the route to my global.asax:

RouteTable.Routes.Add(new ServiceRoute("Admin", new WebServiceHostFactory(), typeof(Admin)));

And my web.config looks like this. I expect this is where I'm doing something wrong. Note that this has changed and morphed many times from reading up here and MS forums etc.

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

<system.webServer>
  <modules runAllManagedModulesForAllRequests="true">
    <add name="UrlRoutingModule" 
       type="System.Web.Routing.UrlRoutingModule, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
  </modules>
  <handlers>
    <add name="UrlRoutingHandler"
       preCondition="integratedMode"
       verb="*"
       path="UrlRouting.axd"
       type="System.Web.HttpForbiddenHandler, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
  </handlers>
</system.webServer>

<system.serviceModel>
  <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
  <standardEndpoints>
    <webHttpEndpoint>
      <standardEndpoint name="" helpEnabled="true" automaticFormatSelectionEnabled="true"/>
    </webHttpEndpoint>
  </standardEndpoints>
</system.serviceModel>

Notes if they are of use:

  • IIS 7.5
  • Windows Server 2008 R2
  • I'm invoking a lot of the methods using JSONP via AJAX calls.
  • Because I am using JSONP the only way I managed to get it working was convert all the required methods to GETs and use streams to invoke the callbacks
  • Everything works fine when I launch via Visual Studio. My problems arise when I host it in IIS.

Any thoughts very much welcome.

The problem in my case ended up being something unrelated to REST and my configuration. I enable WCF web services by adding the following to the config:

<system.diagnostics>
  <sources>
    <source name="System.ServiceModel"
            switchValue="Information, ActivityTracing"
            propagateActivity="true" >
      <listeners>
        <add name="xml"/>
      </listeners>
    </source>
    <source name="System.ServiceModel.MessageLogging">
      <listeners>
        <add name="xml"/>
      </listeners>
    </source>
    <source name="myUserTraceSource"
            switchValue="Information, ActivityTracing">
      <listeners>
        <add name="xml"/>
      </listeners>
    </source>
  </sources>
  <sharedListeners>
    <add name="xml"
         type="System.Diagnostics.XmlWriterTraceListener"
         initializeData="C:\logs\Error.svclog" />
  </sharedListeners>
</system.diagnostics>

Hit my web service again to get the error, and popped open the trace log in "SvcTraceViewer.exe". This highlighted the fact that I was using integrated security on a database. But because I was accessing the service via a browser and IIS hosted site I was hitting the database under the Application Pool Identity. This highlighted this error in the WCF Trace:

System.Data.SqlClient.SqlException: Cannot open database "XYZ" requested by the login. The login failed...

So, long story short, I was being a doofus...

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM