如何从ajax调用WCF服务?

时间:2015-10-21 10:42:00

标签: c# asp.net ajax wcf

我有一个WCF服务,如下所示 -

 [ServiceContract(Namespace = "")]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class Sync
{
    [OperationContract]
    [WebInvoke]
    public string SyncDataNow(UserData obj)
    {
        try
        {
            using (MavenifyEntities db = new MavenifyEntities())
            {
                bool userExist = db.Users.Any(u => u.Id == obj.UserId);
                if (userExist)
                {
                    DataSync data = new DataSync();
                    data.UserId = obj.UserId;
                    data.TempId = obj.TempId;
                    data.Content = obj.Content;
                    data.CreatedDate = DateTime.Now.ToString();
                    db.DataSyncs.Add(data);
                    db.SaveChanges();
                    return "1";
                }
                else
                {
                    return "0";
                }
            }
        }
        catch (Exception ex)
        {
            return "error";
        }
    }
}

[DataContract(Namespace = "")]
public class UserData
{
    [DataMember]
    public int UserId { get; set; }
    [DataMember]
    public string Content { get; set; }
    [DataMember]
    public string TempId { get; set; }
}

当我从POSTMAN调用此服务时,它会收到空数据,请帮我找出我正在做的错误。

我以json格式发送原始数据,如 -

  

{ “的UserData”:{ “用户ID”: “1”, “TempId”: “asdbsjiadf”, “内容”: “你好”}}。

我的web.config条目是 -

 <system.serviceModel>
<behaviors>
  <endpointBehaviors>
    <behavior name="PhoneSync.SyncAspNetAjaxBehavior">
      <enableWebScript />
    </behavior>
  </endpointBehaviors>
</behaviors>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
<services>
  <service name="PhoneSync.Sync">
    <endpoint address="" behaviorConfiguration="PhoneSync.SyncAspNetAjaxBehavior" binding="webHttpBinding" contract="PhoneSync.Sync" /> 
  </service>
</services>

3 个答案:

答案 0 :(得分:0)

您还应该使用Wcf Rest WebHttpBinding您将面临Cross Domain Messaging问题。因此,您将禁用交叉消息传递安全性或为jsonp

创建自己的行为

您的签名也应该是{"UserId":"1","TempId":"asdbsjiadf","Content":"Hello"}。 如果你想使用{"UserData":{"UserId":"1","TempId":"asdbsjiadf","Content":"Hello"}},你应该把它包起来

答案 1 :(得分:0)

确保默认情况下请求/响应为 Json 。我会在 [WebInvoke(RequestFormat = WebMessageFormat.Json,ResponseFormat = WebMessageFormat.Json)]中明确指定

也许有意义的是配置一些选项like suggested here

答案 2 :(得分:0)

我通过更改名称&#34; UserData&#34;解决了这个问题。 to&#34; obj&#34;在我的json,即改变

  

{&#34;的UserData&#34; {&#34;用户ID&#34;:&#34; 1&#34;&#34; TempId&#34;:&#34; asdbsjiadf&#34 ;, &#34;内容&#34;:&#34;你好&#34;}}

  

{&#34;物镜&#34; {&#34;用户ID&#34;:&#34; 1&#34;&#34; TempId&#34;:&#34; asdbsjiadf&#34 ;, &#34;内容&#34;:&#34;你好&#34;}}

现在我收到了我服务中的数据。但我无法理解为什么会这样。请分享原因。