2

I have two OperationContracts on my test WCF service, when I test it locally both CheckGet and CheckPost work. When I call them both on the web server from the web server they both work, but when I call them from the remote server from my local machine, CheckGet works, but CheckPost hangs the browser window.

I have been banging my head against a brick wall all afternoon trying to work out why GET works, but POST doesn't. If anyone can suggest where the mistake is I'd be grateful.

    [OperationContract]
    [WebGet(UriTemplate = "oAuth/CheckGet")]
    string CheckGet();

    [OperationContract]
    [WebInvoke(Method = "POST", UriTemplate = "oAuth/CheckPost", BodyStyle = WebMessageBodyStyle.WrappedRequest)]
    string CheckPost();

Which just return a basic string

    public string CheckGet()
    {
        return "Get is working";
    }

    public string CheckPost()
    {
        return "Post is working";
    }

I am calling them like this:-

    function CheckGet() {
        $.ajax({
            cache: false,
            type: "GET",
            async: false,
            url: serviceRoot + "CheckGet",
            dataType: "json",
            timeout: (5 * 1000),
            success: function (message) {
                alert("Service says - " + message);
            },
            error: function (xhr) {
                alert(xhr.responseText);
            }
        });
    }

    function CheckPost() {
        $.ajax({
            cache: false,
            type: "POST",
            async: false,
            url: serviceRoot + "CheckPost",
            contentType: "application/json",
            dataType: "json",
            timeout: (5 * 1000),
            success: function (message) {
                alert("Service says - " + message);
            },
            error: function (xhr) {
                alert(xhr.responseText);
            }
        });
    }

This is in my Global.asax file

    protected void Application_Start(object sender, EventArgs e)
    {
        RouteTable.Routes.Add(new ServiceRoute("", new WebServiceHostFactory(), typeof(oAuth.Services.oAuth)));
    }

    protected void Application_BeginRequest(object sender, EventArgs e)
    {

            HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);
            HttpContext.Current.Response.Cache.SetNoStore();

            EnableCrossDmainAjaxCall();
    }

    private void EnableCrossDmainAjaxCall()
    {
        HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");
        if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
        {
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST");
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept");
            HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000");
            HttpContext.Current.Response.End();
        }
    }
}

UPDATE

It appears to be something to do with the Global.asax.cs file...

if I comment out HttpContext.Current.Response.End(); then I at least get a response, but if that's there then the Javascript hangs and I get a w3wp.exe error on the server.

user1904444
  • 23
  • 1
  • 5

1 Answers1

0

Your AJAX for your POST is requesting JSON as the contentType, which is not the default of WCF.

Try decorating your class like this:

    [OperationContract]
[WebInvoke(Method = "POST", 
 UriTemplate = "oAuth/CheckPost", 
 BodyStyle = WebMessageBodyStyle.WrappedRequest,
 ResponseFormat = WebMessageFormat.Json)]
string CheckPost();
Nick Zimmerman
  • 1,471
  • 11
  • 11
  • Just tried that and it still hangs when trying to call the service on the remote machine from my local machine. As before it still works on local calling service on local machine and remote calling service on remote machine... The request seems to disappear off into a black hole and no success or error is returned. – user1904444 May 30 '14 at 14:51