2016-01-21 72 views
8

我已经到了一个地步,我可以从我的WCF Web服务中的客户端网站(我在我工作的公司内部使用)接收响应。但每当我收到回应时,它总是空。客户端网站总是返回空Json字符串

我已经四处寻找各种解决方案,他们似乎都没有解决这个问题。我有以下几点:

[OperationContract] 
[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest, UriTemplate = "/AddNewActivity")] 
String AddNewActivity(String jsonObject); 

并实现了:

public String AddNewActivity(String jsonObject) 
{ 
    return JsonConvert.SerializeObject("Success"); 
} 

只是为了测试它的工作原理。我在上面的函数中设置了一个断点来读取jsonObject字符串并查看它的样子。当我读它时,它是空的。始终为空。

这里是JavaScript:

function OnModalCreateNewActivityBtnClick() { 
    var modal = $('#new-activity-modal-body'); 
    var activityMap = { 
     status: modal.find('#new-activity-modal-status-dropdown').val(), 
     name: modal.find('#new-activity-modal-name-field').val(), 
     responsible: modal.find('#new-activity-modal-responsible-field').val(), 
     department: modal.find('#new-activity-modal-department-dropdown').val(), 
     startTime: modal.find('#new-activity-modal-datepicker-start').val(), 
     endTime: modal.find('#new-activity-modal-datepicker-end').val(), 
     description: modal.find('#editor').cleanHtml(), 
     axAccounts: modal.find('#new-activity-modal-ax-account-numbers-field').val() 
    }; 
    var jsonObject = '{ "String": ' + JSON.stringify(activityMap) + '}'; 
    $.ajax({ 
     type: 'POST', 
     url: 'http://localhost:52535/PUendeligService.svc/AddNewActivity', 
     data: jsonObject, 
     contentType: 'application/json; charset=utf-8', 
     dataType: 'json', 
     processData: true, 
     success: function (data, status, jqXHR) { 
      alert("Success: " + data); 
     }, 
     error: function (xhr) { 
      console.log(xhr.responseText); 
      alert("Error: " + xhr.responseText); 
     } 
    }); 
} 

任何人有,为什么它返回null什么想法?

UPDATE

我用小提琴手和该网站留下的Web服务的信息是正确的。这是一个Fiddler可以读取的JSON字符串。但是Web服务仍然接收到一个空对象。

+0

当您移除'dataType:'json''时会发生什么?我有一种感觉,它试图将请求反序列化为一个与接受字符串的方法相反的对象。 – Rob

+3

尝试var jsonObject ='{“jsonObject:'+ JSON.stringify(activityMap)+'}';因为您使用的是BodyStyle = WebMessageBodyStyle.WrappedRequest,所以您的paremeter名称应该匹配,您应该使用WebMessageBodyStyle.Bare,需要使用上面的线 –

+0

对不起,我混淆了它们。如果你改变'contentType:'text/plain'',并保持'dataType'的原样。 – Rob

回答

2

让我们简化您的样品了一下,这个

<script type="text/javascript"> 
    function OnModalCreateNewActivityBtnClick() { 

     var data = { 
      Status: modal.find('#new-activity-modal-status-dropdown').val(), 
      Name: modal.find('#new-activity-modal-name-field').val() 
     }; 

     $.ajax({ 
      type: 'POST', 
      url: 'Service.svc/AddNewActivity', 
      data: JSON.stringify(data), 
      contentType: 'application/json; charset=utf-8', 
      dataType: 'json', 
      success: function (msg) { 
       alert(data.Status + ' == ' + msg.Status); 
      }, 
      error: function (e) { 
       alert('failed with ' + e.statusText); 
      } 
     }); 
    } 
</script> 

开始你的活动类

[DataContract] 
    public class Activity 
    { 
     [DataMember] 
     public String Status 
     { 
      get; set; 
     } 

     [DataMember] 
     public String Name 
     { 
      get; set; 
     } 
    } 

实施

[WebInvoke(Method ="POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "AddNewActivity/")] 
public Activity AddNewActivity(Activity activity) 
{ 
    // your stuff 
    return activity; 
} 

最后,因为你并没有显示你的配置,让我们假设如下

 <system.serviceModel> 
    <services> 
     <service name="PUendelig.Service" behaviorConfiguration="serviceBehavior"> 
     <endpoint address="" binding="webHttpBinding" contract="PUendelig.IService" behaviorConfiguration="web"/> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="serviceBehavior"> 
      <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/> 
      <serviceDebug includeExceptionDetailInFaults="false"/> 
     </behavior> 
     </serviceBehaviors> 

     <endpointBehaviors> 
     <behavior name="web"> 
      <webHttp/> 
     </behavior> 
     </endpointBehaviors> 

    </behaviors> 

    <protocolMapping> 
     <add binding="basicHttpsBinding" scheme="https"/> 
    </protocolMapping> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/> 
    </system.serviceModel> 

我把它放在github中供您下载。请随时根据需要进行调整,并在此过程中帮助其他人 https://github.com/alexnolasco/WCFJSONExample

+0

好的,我给它一看一次我回到周一上班。看起来它可以工作,因为我的初始设置可能不合时宜。 – OmniOwl

1

变化从application/jsonapplication/x-www-form-urlencoded

+0

我仍然得到一个错误的请求错误 – OmniOwl

+0

我不知道你现在如何使用它,但如果你准备好这样的数据var jsonObject = JSON.stringify(activityMap);并把内容类型的应用程序/ x-www-form-urlencoded它应该工作。你不需要手动添加大括号 – hellwd

+0

我有这个C#部分:[[OperationContract] [WebInvoke(Method =“POST”,RequestFormat = WebMessageFormat.Json,ResponseFormat = WebMessageFormat.Json,BodyStyle = WebMessageBodyStyle.WrappedRequest,UriTemplate =“/ AddNewActivity”)] String AddNewActivity(String jsonObject);'不知道这是否告诉你什么。 – OmniOwl

2

错误的内容类型似乎是在这里:

var jsonObject = '{ "String": ' + JSON.stringify(activityMap) + '}'; 

删除线,因为你不需要它,改变你的AJAX调用如下:

$.ajax({ 
     type: 'POST', 
     url: 'http://localhost:52535/PUendeligService.svc/AddNewActivity', 
     data: {jsonObject: JSON.stringify(activityMap) }, 
     contentType: 'application/json; charset=utf-8', 
     dataType: 'json', 
     processData: true, 
     success: function (data, status, jqXHR) { 
      alert("Success: " + data); 
     }, 
     error: function (xhr) { 
      console.log(xhr.responseText); 
      alert("Error: " + xhr.responseText); 
     } 
    }); 

问题是,你的服务期望“jsonObject”变量,但你发送“字符串”。希望这可以帮助。

+0

仍然得到错误的请求:/ – OmniOwl

+0

@Vipar您能够从一些第三方工具上传到服务器的请求(例如Chrome扩展DHC或提琴手)? –

+0

我不认为json.stringify给人一种属性格式逃脱JSON字符串所有的“需要用\替换为” – Batavia