将json发送到(不是REST)WCF服务

时间:2012-07-20 13:02:26

标签: javascript .net json wcf

我需要有一个javascript,它会将对象作为json发送到WCF服务来保存它。 我有javascript:

 <script>
      $(document).ready(function(){

                    $("#submitButton").click(function() {

console.info("executing submitButton click");
TestJSon();
 );
      });
       </script>
        <button type="button" id="submitButton">Save</button>
        <script>
            var varType;
            var varUrl;
            var varData;
            var varContentType;
            var varDataType;
            var varProcessData;          
            //Generic function to call AXMX/WCF  Service        
            function CallService() 
            {
            console.log('called CallService')
                    $.ajax({
                        type        : varType, //GET or POST or PUT or DELETE verb
                        url         : varUrl, // Location of the service
                        data        : varData, //Data sent to server
                        contentType : varContentType, // content type sent to server
                        dataType    : varDataType, //Expected data format from server
                        processdata : varProcessData, //True or False
                        success     : function(msg) {//On Successfull service call
                        ServiceSucceeded(msg);                    
                        },
                        error: ServiceFailed// When Service call fails
                    });
        }

        function ServiceSucceeded(result) {//When service call is sucessful
       alert('Service call succeded');
             varType=null;varUrl = null;varData = null;varContentType = null;varDataType = null;varProcessData = null;     
        }
        function ServiceFailed(result) {
            alert('Service call failed: ' + result.status + '' + result.statusText);
            varType = null; varUrl = null; varData = null; varContentType = null; varDataType = null; varProcessData = null;     
        }



        function TestJSon() {
                varType = "POST";
            varUrl = "http://localhost:56616/bebc179a-3a96-4934-88df-df1ca17da8b1/CountryDataService.svc/SaveObject";
            varData = { player: {'Name': '1' }};
            varContentType = "application/json; charset=utf-8";
            varDataType = "json";
            varProcessData = true;
            CallService();

        }
</script>

此脚本应使用此WCF方法:

 public void SaveObject(Player player)
        {
             var input = player;
            File.WriteAllText(@"c:\Temp\" + "index.html", input.Name, Encoding.UTF8);
            return player;
        }
服务接口上的

是:

[OperationContract]
        [WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json)]
        void SaveObject(Player player);

玩家类:

[DataContract(Name = "Player")]
    public class Player
    {
        private string _name;
        [DataMember]
        public string Name { get { return _name; } set { _name = value; } }     

    }
我在配置中

<services>
 <service name="MyCompany.Services.CountryDataService" behaviorConfiguration="CountryProvinceBehavior" >
    <endpoint address="" binding="webHttpBinding" contract="MyCompany.Services.ICountryDataService" behaviorConfiguration="CountryProvinceBehavior"/>
  </service>

   <behaviors>     
      <endpointBehaviors>
        <behavior name="CountryProvinceBehavior">
          <webHttp/>
        </behavior>
      </endpointBehaviors> 
      <serviceBehaviors>
        <behavior name="CountryProvinceBehavior">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>          
      </serviceBehaviors>
    </behaviors>     
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true" />
  </system.webServer>

而且最重要的 - 结果: 方法ServiceFailed已使用代码0和statusText - NoTransport命中 也没有交通(Fiddler告诉我) 服务的地址是可以的,因为当我将json更改为jsonp时,ServiceFailed也被代码200和statusText命中 - 成功。

并且有一个流量:

请求

GET http://localhost:56616/bebc179a-3a96-4934-88df-df1ca17da8b1/CountryDataService.svc/SaveObject?callback=jQuery1710486683341013641_1342788918981&player%5BName%5D=1&_=1342788921786 HTTP/1.1
Accept: application/javascript, */*;q=0.8
Accept-Language: en-US
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
Host: localhost:56616

响应

HTTP/1.1 404 Not Found
Content-Length: 1565
Content-Type: text/html; charset=UTF-8
Server: Microsoft-IIS/7.5
X-Powered-By: ASP.NET
Date: Fri, 20 Jul 2012 12:55:21 GMT

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <title>Service</title>
    <style>BODY { color: #000000; background-color: white; font-family: Verdana; margin-left: 0px; margin-top: 0px; } #content { margin-left: 30px; font-size: .70em; padding-bottom: 2em; } A:link { color: #336699; font-weight: bold; text-decoration: underline; } A:visited { color: #6699cc; font-weight: bold; text-decoration: underline; } A:active { color: #336699; font-weight: bold; text-decoration: underline; } .heading1 { background-color: #003366; border-bottom: #336699 6px solid; color: #ffffff; font-family: Tahoma; font-size: 26px; font-weight: normal;margin: 0em 0em 10px -20px; padding-bottom: 8px; padding-left: 30px;padding-top: 16px;} pre { font-size:small; background-color: #e5e5cc; padding: 5px; font-family: Courier New; margin-top: 0px; border: 1px #f0f0e0 solid; white-space: pre-wrap; white-space: -pre-wrap; word-wrap: break-word; } table { border-collapse: collapse; border-spacing: 0px; font-family: Verdana;} table th { border-right: 2px white solid; border-bottom: 2px white solid; font-weight: bold; background-color: #cecf9c;} table td { border-right: 2px white solid; border-bottom: 2px white solid; background-color: #e5e5cc;}</style>
  </head>
  <body>
    <div id="content">
      <p class="heading1">Service</p>
      <p>Endpoint not found.</p>
    </div>
  </body>
</html>

因此,我需要帮助在我的WCF服务中保存此Player对象。我正在使用Wk8和.net 4.0

我会感激任何帮助。

3 个答案:

答案 0 :(得分:5)

让我们一步一步地做到这一点,这样你就可以有一个起点。

  1. 创建一个新的Empty ASP.NET应用程序
  2. 添加模型类

    [DataContract]
    public class Player
    {
        [DataMember]
        public string Name { get; set; }
    }
    
  3. 服务合同:

    [ServiceContract]
    public interface ICountryDataService
    {
        [OperationContract]
        [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest)]
        void SaveObject(Player player);
    }
    
  4. 并实施:

    public class CountryDataService : ICountryDataService
    {
        public void SaveObject(Player player)
        {
        }
    }
    
  5. 添加.svc端点(CountryDataService.svc):

    <%@ ServiceHost 
        Language="C#" 
        Debug="true" 
        Service="MyService.CountryDataService" 
    %>
    
  6. 修改web.config:

                      

    <system.serviceModel>
        <behaviors>
          <endpointBehaviors>
            <behavior name="CountryProvinceBehavior">
              <webHttp/>
            </behavior>
          </endpointBehaviors>          
            <serviceBehaviors>
                <behavior name="">
                    <serviceMetadata httpGetEnabled="true" />
                    <serviceDebug includeExceptionDetailInFaults="false" />
                </behavior>
            </serviceBehaviors>
        </behaviors>
        <services>
            <service name="MyService.CountryDataService">
              <endpoint 
                address="" 
                binding="webHttpBinding" 
                contract="MyService.ICountryDataService" 
                behaviorConfiguration="CountryProvinceBehavior" />
            </service>          
        </services>
        <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
    </system.serviceModel>
    

  7. 添加index.htm消费:

    <!DOCTYPE html>
    <html>
    <head>
        <title></title>
    </head>
    <body>
        <script type="text/javascript" src=" http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
        <script type="text/javascript">
            $.ajax({
                url: 'countrydataservice.svc/saveobject',
                type: 'POST',
                contentType: 'application/json',
                data: JSON.stringify({ player: { Name: 'foo bar'} }),
                success: function (result) {
    
                }
            });
        </script>
    </body>
    </html>
    

  8. 更新:

    这是我的示例解决方案的链接:http://www.filedropper.com/myservice

答案 1 :(得分:1)

看起来您在端点行为中有错误的元素。 尝试使用配置中的<webHttp/>替换<enableWebSCript/>

  <endpointBehaviors>
    <behavior name="CountryProvinceBehavior">
      <enableWebScript/>
    </behavior>
  </endpointBehaviors>

答案 2 :(得分:1)

当您设置端点行为配置以使用<enableWebScript />时,WCF会为您生成JavaScript代理端点。因此,您可以更轻松地将其用于开箱即用。

Web.config文件

<system.serviceModel>
<services>
  <service name="Service.TestService">
    <endpoint address="" contract="Service.ITestService" binding="webHttpBinding" behaviorConfiguration="web"/>
  </service>
</services>

<behaviors>
  <serviceBehaviors>
    <behavior name="">
      <serviceMetadata httpGetEnabled="true" />
    </behavior>
  </serviceBehaviors>
  <endpointBehaviors>
    <behavior name="web">
      <enableWebScript />
    </behavior>
  </endpointBehaviors>
</behaviors>

服务合同

[ServiceContract(Name = "TestService", Namespace = "Service")]
public interface ITestService
{
    [OperationContract]
    [WebInvoke(ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)]
    int GetSum(int a, int b);
}

例如,您的服务托管在localhost/TestService.svc上,然后获取JavaScript代理类代码,您应该转到网址localhost/TestService.svc/js

如何使用JS代理类

var proxy = new Service.TestService(); 
proxy.GetSum(1, 2, function(response) { alert('Result: ' + response); }, function(response) { alert('Error'); }, proxy);

有关详细信息,请查看http://msdn.microsoft.com/en-us/library/bb412167.aspx