2014-05-30 2 views
2

У меня есть два OperationContracts в моей тестовой службе WCF, когда я тестирую его локально как CheckGet, так и CheckPost. Когда я вызываю их как на веб-сервере с веб-сервера, они оба работают, но когда я вызываю их с удаленного сервера с моей локальной машины, CheckGet работает, но CheckPost висит в окне браузера.GET работает, но POST не работает при вызове WCF из JQuery на удаленном сервере

Я все время пытался ударить головой о кирпичную стену, пытаясь понять, почему работает GET, но POST этого не делает. Если кто-нибудь может указать, где ошибка, я был бы благодарен.

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

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

Который просто возвращает основную строку

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

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

Я называю их так: -

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); 
      } 
     }); 
    } 

Это в моей Global.asax файл

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(); 
     } 
    } 
} 

ОБНОВЛЕНИЕ

Это, кажется, что-то делать с файлом Global.asax.cs ...

если я закомментировать HttpContext.Current.Response.End(); то я, по крайней мере, получаю ответ, но если это так, Javascript зависает, и я получаю ошибку w3wp.exe на сервере.

+0

Такая же проблема ... –

ответ

0

Ваш AJAX для вашего POST запрашивает JSON как contentType, который не является стандартом WCF.

Попробуйте украсить свой класс, как это:

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

Просто попробовал, что и она по-прежнему зависает при попытке вызова службы на удаленном компьютере с моей локальной машине. Как и раньше, он по-прежнему работает в локальной телефонной службе на локальном компьютере и удаленном вызове на удаленной машине ... Кажется, что запрос пропадает в черную дыру, и никакой успешной или ошибки не возвращается. – user1904444

Смежные вопросы