将 json 发送到(不是 REST)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>

最重要的是 - 结果:方法服务失败已命中代码 0 和状态文本 - 无传输也没有交通(小提琴手告诉我(服务的地址还可以,因为当我将 json 更改为 jsonp 服务失败时,也遇到了代码 200 和状态文本 - 成功。

还有一条交通:

请求

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 服务中保存此播放器对象的帮助。我正在使用 Wk8 和 .net 4.0

我将不胜感激任何帮助。

让我们一步一步地做这件事,以便你可以有一个起点。

  1. 创建新的空 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. 修改网络配置:

    <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>
    

更新:

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

看起来终结点行为中有错误的元素。尝试将配置中的<webHttp/>替换为<enableWebSCript/>

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

当您将终结点行为配置设置为使用 WCF 会为你生成 JavaScript 代理终结点<enableWebScript />时。因此,开箱即用会更简单。

网络配置文件

<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 代理类代码,您应该转到 url 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

最新更新