3

I have a very simple OpenRasta app with a Home resource with a single string property of Title (straight from the OpenRasta community doc example).

I've set up both XML and JSON data contracts for the resource like this:

ResourceSpace.Has.ResourcesOfType<Home>()
    .AtUri("/home")
    .HandledBy<HomeHandler>()
    .AsXmlDataContract()
    .And.AsJsonDataContract();

From jQuery, I'm able to get the JSON data just fine. However, when I make a jQuery XML Ajax request, I get JSON data back.

My jQuery code looks like this:

$.ajax(
{
    url: "/home",
    dataType: "xml",
    success: function(result) {
        $('#xmlSpan').append($(result).find('Title').text());
    },
    error: function(request, status, ex) {
        $('#xmlSpan').append('error: ');
        $('#xmlSpan').append(status + ', ');
        $('#xmlSpan').append(ex.toString());
    }
});

The error information being appended ends up looking like this:

error: parsererror, TypeError: a is null

But here is the interesting part. From Fiddler, my request looks like this:

GET http://127.0.0.1:51041/home HTTP/1.1
Host: 127.0.0.1:51041
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.8) Gecko/20100202 Firefox/3.5.8
Accept: application/xml, text/xml, */*
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
X-Requested-With: XMLHttpRequest
Referer: http://ipv4.fiddler:51041/WebForm1.aspx
Cache-Control: max-age=0

...and my response looks like this:

HTTP/1.1 200 OK
Server: ASP.NET Development Server/9.0.0.0
Date: Thu, 04 Mar 2010 18:30:04 GMT
X-AspNet-Version: 2.0.50727
Content-Length: 18
Cache-Control: private
Content-Type: application/json; q=0.5
Connection: Close

{"Title":"Foooo!"}

My request is coming in as "Accept: application/xml" but the response is "application/json" (and the returned data is obviously json).

What am I doing wrong?

kindohm
  • 1,580
  • 18
  • 38

1 Answers1

4

Mike,

(sorry I didn't see that quesiton before)

You're not doing anything wrong, and this should work jsut fine.

Your Accept: header specifies that your client is happy to receive application/xml or anything else (/). Chances are that OpenRasta assumes that "anything else" works and goes with the json codec.

If you change your header to

Accept: application/xml, text/xml;q=0.9, /;q=0.8

Then you shoudl be fine. Alternatively, just remove the / alltogether/

That said, normaly / is always put as a last resort in the content negotiation algorythms of openrasta, so this result is very surprising. What version of OR are you using?

SerialSeb
  • 6,701
  • 24
  • 28
  • I'll look in to this this week. I just got back from vacation and will sort this out first chance I get. Thanks for following up. -Mike – kindohm Mar 29 '10 at 01:25
  • 1
    Here's what I found out... I downloaded the latest release candidate of OR (2.0.3214.437) and still had the same problem. As you suggested, I modified my jQuery .ajax call to modify the Accept header and then everything started working: beforeSend: function(xhr) { xhr.setRequestHeader('Accept', 'application/xml, text/xml') } Ideally, I think the jQuery developer shouldn't have to worry about modifying the header to get this to work. Now that I know the solution it's great but others will probably run in to this. – kindohm Mar 30 '10 at 15:43
  • 2
    You're quite right, the accept header should be set automatically based on the submitted content type me thinks. I'll fill a bug report on jQuery about them not prioritizing stuff properly. – SerialSeb Apr 02 '10 at 11:14