2013-06-07 5 views
0

Похоже, я могу опубликовать текст в службе REST, но я не могу опубликовать json или текст, похожий на json, и я не могу понять, почему. Внизу я включил два разных бита Ajax, один из которых работает (только передача строки), а другой - нет (передача строки Json). Ошибка, которую я получаю, когда она не работает, - «Метод не разрешен», но я подозреваю, что это потому, что он пытается POST использовать метод GET ... по крайней мере, это то, на что похоже. GET отлично работает. Кроме того, я могу воспроизвести это в скрипаче.Невозможно выполнить POST Json для REST

контракта:

[ServiceContract] 
public interface IUser 
{ 
    [ OperationContract ] 
    [ WebGet (UriTemplate = "" , ResponseFormat = WebMessageFormat.Json)] 
    MyUserObject GetUser(); 

    [ OperationContract ] 
    [ WebInvoke (UriTemplate = "{userToUpdate}" , Method = "POST", RequestFormat = WebMessageFormat .Json, BodyStyle = WebMessageBodyStyle .WrappedRequest)] 
    void UpdateUser(string userToUpdate); 
} 

Класс:

[ AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode .Allowed)] 
[ ServiceBehavior(InstanceContextMode = InstanceContextMode .PerCall)] 
public class User : IUser 
{ 

    [ WebGet (UriTemplate = "" , ResponseFormat = WebMessageFormat.Json)] 
    public MyUserObject GetUser() 
    { 
     UserState thisSessionManager = new UserState(); 
     MyUserObject returnMe = thisSessionManager.GetCurrentUser(); 
     return returnMe; 
    } 


    [ WebInvoke (UriTemplate = "{userToUpdate}" , Method = "POST", RequestFormat = WebMessageFormat .Json, BodyStyle = WebMessageBodyStyle .WrappedRequest)] 
    public void UpdateUser(string userToUpdate) 
    { 
     ///here I'm just logging the text value 
    } 

} 

}

маршрутизации:

private void RegisterRoutes() 
    { 
     WebServiceHostFactory factory = new WebServiceHostFactory(); 
     RouteTable .Routes.Add(new ServiceRoute("services/user" , factory, typeof (BigHistory.Services.User))); 
    } 

Ajax, который не работает:

var passthis = JSON.stringify(thisUser); 
    $.ajax({ 
     type: "POST" , 
     url: "/services/user" , 
     data: "{ 'userToUpdate':'" + passthis + "'}" , 
     contentType: "application/json; charset=utf-8" , 
     dataType: "json" , 
     async: true , 
     success: function (data) { 

     }, 
     error: function (jqXHR, textStatus, errorThrown) { 
      alert(errorThrown); 
     } 
    }); 

Ajax, что делает работу ("XYZ123" регистрируется с помощью правильной работы в классе):

$.ajax({ 
     type: "POST" , 
     url: "/services/user/xyz123" , 
     contentType: "application/json; charset=utf-8" , 
     dataType: "text" , 
     async: true , 
     success: function (data) { 

     }, 
     error: function (jqXHR, textStatus, errorThrown) { 
      alert(errorThrown); 
     } 
    }); 

Coinfig:

<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" /> 
<standardEndpoints> 
    <webHttpEndpoint> 
    <standardEndpoint name="" helpEnabled="true" automaticFormatSelectionEnabled="true"/> 
    </webHttpEndpoint> 
</standardEndpoints> 
<services> 
    <service name="MyName.Services.User" behaviorConfiguration="myServiceBehavior"> 
    <endpoint name="webHttpBinding" address="" binding="webHttpBinding" contract="MyName.Services.IUser" behaviorConfiguration="webHttp"></endpoint> 
    </service> 
</services> 
<behaviors> 
    <serviceBehaviors> 
    <behavior name ="myServiceBehavior"> 
     <serviceMetadata httpGetEnabled="true"/> 
     <serviceDebug includeExceptionDetailInFaults="true"/> 
    </behavior> 
    <behavior> 
     <serviceMetadata httpGetEnabled="true"/> 
     <serviceDebug includeExceptionDetailInFaults="true"/> 
    </behavior> 
    </serviceBehaviors> 
    <endpointBehaviors> 
    <behavior name ="webHttp"> 
     <webHttp/> 

    </behavior> 
    </endpointBehaviors> 
</behaviors> 

Объект, как и передается на консоль:

{"Email":"","FirstName":"Joe","IHaveSeenMyProfilePage":false} 

Любая помощь на всех была бы оценена.

ответ

0

Изменено это:

UriTemplate = "{userToUpdate}" 

Для этого:

UriTemplate = "" 

И все хорошо.

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