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:
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:
So, long story short, I was being a doofus…