Moo-Juice
Moo-Juice

Reputation: 38820

Calling ServiceStack Service Cross-Domain with Cors Issue

I am in the process of testing some web services on my local machine. Because the test page sits on the root at port 80, and the web-services on different ports, I get the following error from Chrome's diagnostic tool:

XMLHttpRequest cannot load http://PCNAME:8083/PackageSearch. Origin http://PCNAME is not allowed by Access-Control-Allow-Origin.

After doing some searching, I came across the CORS Features of ServiceStack, and put the following attribute on my Web Service:

[EnableCors(allowedMethods: "GET, POST")]

However, the error still persists. This is the ajax call:

function packageSearch(tourCode) {
            var searchUrl = url + 'PackageSearch';
            var searchData = {
                TourCode: tourCode,
            };
            $.ajax(searchUrl,{
                    data : JSON.stringify(searchData),
                    type: 'POST',
                    contentType: 'application/json, charset=utf-8',
                    dataType: 'json',
                    success: function (result) {
                       oTable.fnClearTable();
                   }});
        };

Where url is http://PCNAME/.

EDIT

I have even set up the following during the Configuration stage:

    public override void Configure(Funq.Container container)
    {
        Plugins.Add(new CorsFeature());

        RequestFilters.Add((httpReq, httpRes, requestDto) =>
            {
                if (httpReq.HttpMethod == "OPTIONS")
                    httpRes.End();
            });
        base.SetConfig(new EndpointHostConfig
        {
            DefaultContentType = "application/json",
            GlobalResponseHeaders = {
            { "Access-Control-Allow-Origin", "*" },
            { "Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS" },
            { "Access-Control-Allow-Headers", "Content-Type, origin, accept" },
        }
        });
        });
    }   // Configure

Upvotes: 2

Views: 1418

Answers (2)

Raul Nohea Goodness
Raul Nohea Goodness

Reputation: 2579

I thought this code looks suspicious:

if (httpReq.HttpMethod == "OPTIONS")
    httpRes.End();

I think although you are setting all header responses to send CORS headers, you may be short-circuiting the HTTP response headers - they never get sent. You could verify if you use Fiddler to check the exact http response headers sent back.

See this SO answer: ServiceStack returns 405 on OPTIONS request They send the headers before calling httprequest.end().

You probably have to do:

httpRes.AddHeader("Access-Control-Allow-Origin", "*");

... before calling response.end()

Upvotes: 1

Tyler Smith
Tyler Smith

Reputation: 1279

You need a ContentType specified and may have to do a preflight message (OPTIONS) to do the handshake that will allow you to proceed with a cross domain call.

Upvotes: 1

Related Questions