How to handle the trailing slash in a WCF HTTP Service
The other day I got this tweet from Adam
@ronljacobs anyway to do something like: [WebGet(UriTemplate = "{id}", IgnoreTrailingSlash = true)] want {id} and {id}/ to be the same
Off hand I didn’t know the answer but now that I’m back from Tech-Ed I decided to take a look at the problem.
I went to my WCF WebHttp REST Entity Service sample and because I had loads of unit tests I just created a new test case. I had to modify my HttpTestHelper class to allow for a trailing slash.
public void GET_MUST_return_a_resource_given_a_key_if_the_resource_with_that_key_exists_slash(WebContentFormat format)
{
// Arrange
int expectedKey = 1;
var testHelper = new HttpTestHelper<int, Resource>(ServiceUri);
// Act
var result = testHelper.GetResource(expectedKey, format: format, trailingSlash: true);
// Assert
Assert.AreEqual(expectedKey, result.Resource.Key);
Assert.AreEqual(HttpStatusCode.OK, result.Status);
}
Then I called this test case for both XML and Json formats. As expected I now had two tests that were failing.
Why did the test fail?
Because to WCF https://localhost/resource/1 is not the same thing as https://localhost/resource/1/
But in this case, Adam wanted them to behave the same way.
Fixing the Service
Now that I had test cases that were failing, fixing them was a snap. All I had to do was add another method to the service with the URI template the contained the trailing slash. Then I simply call the overload that I use for requests without the trailing slash.
// Handles the case where there is a trailing slash
[Description("Demonstrates how to GET a resource with a trailing slash")]
[WebGet(UriTemplate = "/{key}/")]
public Resource GetResourceSlash(string key)
{
return GetResource(key);
}
Booyah! it totally works.
WCF WebHttp REST Entity Service Sample code updated
Happy Coding!
Ron Jacobs
https://blogs.msdn.com/rjacobs
Twitter: @ronljacobs https://twitter.com/ronljacobs