none
web service调用客户端函数 RRS feed

  • 问题

  • 我想实现这样一个需求;

     web service主动调用某个客户端的函数,结果在客户端显示。比如,弹出一个对话框什么的。

     注意:不是客户端发出请求,服务器端异步响应的这种。而是,服务器端主动去调用客户端。

     可以在服务器端配置客户端吗?或者有其他更好的思路,望高手指点!

    2011年4月27日 3:22

答案

全部回复

  • 通过看资料,我发现这个需求从思路上来说,就不对。

    web service基于HTTP协议的话,就是request/response,不论怎样都需要客户端发出请求才行。

    看来只有使用轮询+异步回调的方式来实现了。

    WCF支持TCP协议不知道可不可以?

    • 已标记为答案 amadok 2011年4月27日 12:42
    • 取消答案标记 amadok 2011年4月27日 12:42
    • 已标记为答案 amadok 2011年7月19日 2:54
    • 取消答案标记 amadok 2011年7月19日 2:54
    2011年4月27日 12:41
  • 你好 WCF是可以的;

    也可以直接用.NET Remoting 参考我这篇文章 http://hi.baidu.com/1987raymond/blog/item/6e3faf1302b96c886538db9b.html

    在你这种情况下,其实你说的客户端就是服务器端了,服务器端就是客户端了

     


    Raymond Tang (Microsoft C# MVP)
    Denn Ich Gehoer nur mir
    微软中文论坛同城社区成都QQ群:74268428
    My Chinese Blog
    Chengdu,Sichuan Province,China
    • 已建议为答案 ThankfulHeart 2011年5月4日 3:07
    • 取消建议作为答案 ThankfulHeart 2011年5月4日 5:21
    • 已标记为答案 amadok 2011年7月19日 2:54
    2011年4月28日 3:19
    版主
  • 您好:) 就我个人意见而言。如果你是开发WinForm的,直接在WinForm的程序中引入WebService,然后调用一般的方法,就像使用net类库一样调用,然后用MessageBox弹出即可。 如果是WebForm,那么用jQuery的Ajax异步非常好。这里我不妨给你一个例子(如果你需要,请发送邮件到maledong@qq.com,主题“天气预报AJAX代码示例”) <!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>JQuery AJAX示例代码</title> <script> $(function () { //先获取全部的省等地方(返回一个xml的string数组) $.ajax({ type: "post", url: "http://www.webxml.com.cn/webservices/weatherwebservice.asmx/getSupportProvince", datatype: "xml", success: function (result) { $(result).find("string").each( function () { //$(this).text()的“text”方法可以获取html容器和xml容器的文字 $("#selProvinces").append("<option value='" + $(this).text() + "'>" + $(this).text() + "</option>"); }); } }); //然后根据选择的省,加载所有的市 $("#selProvinces").change(function () { //清空所有项目 $("#selCities").empty(); //动态加载 $.ajax({ type: "post", timeout: 1200, url: "http://www.webxml.com.cn/webservices/weatherwebservice.asmx/getSupportCity", data: "byProvinceName=" + $("#selProvinces").val(), //给Service传递参数 datatype: "xml", //成功加载: success: function (result) { $(result).find("string").each(function () { $("#selCities").append("<option value='" + $(this).text() + "'>" + $(this).text() + "</option>"); }); } }); }); //根据动态选择的城市,查询对应的天气预报情况: $("#selCities").change(function () { $("#ulResult").empty(); //因为放到Dropdownlist中的选项是“名称(编号)”,所以只要名称 var foundcontent = $.trim($("#selCities").val().substring(0, $("#selCities").val().indexOf("("))); $.ajax({ type: "post", url: "http://www.webxml.com.cn/webservices/weatherwebservice.asmx/getWeatherbyCityName", data: "theCityName=" + foundcontent, datatype: "xml", //准备加载(注意:S必须大写!) beforeSend: function () { $("#spResult").css("display", "block"); }, //成功了…… success: function (result) { $(result).find("string").each(function () { //排除第三个图片输出 if ($(this).text().indexOf(".gif")>0) { $("#ulResult").append("
  • <image src='Image/" + $(this).text() + "'/>"); } else { if($(this).text().indexOf(".jpg")<0) { $("#ulResult").append("
  • " + $(this).text() + ""); } } }); }, //完成了…… complete: function () { $("#spResult").css("display", "none"); } }) }); }) </script> <style type="text/css"> #Select1 { width: 198px; } #selCities { width: 233px; } #selProvinces { width: 227px; } </style> </head> <body> 请选择你需要的省(市):<select id="selProvinces"> </select>
    请选择你需要的区(县):<select id="selCities"> </select>

    查询结果:请稍后……
    </body> </html>
2011年4月29日 6:41
  • 您好:) 就我个人意见而言。如果你是开发WinForm的,直接在WinForm的程序中引入WebService,然后调用一般的方法,就像使用net类库一样调用,然后用MessageBox弹出即可。 如果是WebForm,那么用jQuery的Ajax异步非常好。这里我不妨给你一个例子(如果你需要,请发送邮件到maledong@qq.com,主题“天气预报AJAX代码示例”) <!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>JQuery AJAX示例代码</title> <script> $(function () { //先获取全部的省等地方(返回一个xml的string数组) $.ajax({ type: "post", url: "http://www.webxml.com.cn/webservices/weatherwebservice.asmx/getSupportProvince", datatype: "xml", success: function (result) { $(result).find("string").each( function () { //$(this).text()的“text”方法可以获取html容器和xml容器的文字 $("#selProvinces").append("<option value='" + $(this).text() + "'>" + $(this).text() + "</option>"); }); } }); //然后根据选择的省,加载所有的市 $("#selProvinces").change(function () { //清空所有项目 $("#selCities").empty(); //动态加载 $.ajax({ type: "post", timeout: 1200, url: "http://www.webxml.com.cn/webservices/weatherwebservice.asmx/getSupportCity", data: "byProvinceName=" + $("#selProvinces").val(), //给Service传递参数 datatype: "xml", //成功加载: success: function (result) { $(result).find("string").each(function () { $("#selCities").append("<option value='" + $(this).text() + "'>" + $(this).text() + "</option>"); }); } }); }); //根据动态选择的城市,查询对应的天气预报情况: $("#selCities").change(function () { $("#ulResult").empty(); //因为放到Dropdownlist中的选项是“名称(编号)”,所以只要名称 var foundcontent = $.trim($("#selCities").val().substring(0, $("#selCities").val().indexOf("("))); $.ajax({ type: "post", url: "http://www.webxml.com.cn/webservices/weatherwebservice.asmx/getWeatherbyCityName", data: "theCityName=" + foundcontent, datatype: "xml", //准备加载(注意:S必须大写!) beforeSend: function () { $("#spResult").css("display", "block"); }, //成功了…… success: function (result) { $(result).find("string").each(function () { //排除第三个图片输出 if ($(this).text().indexOf(".gif")>0) { $("#ulResult").append("
  • <image src='Image/" + $(this).text() + "'/>"); } else { if($(this).text().indexOf(".jpg")<0) { $("#ulResult").append("
  • " + $(this).text() + ""); } } }); }, //完成了…… complete: function () { $("#spResult").css("display", "none"); } }) }); }) </script> <style type="text/css"> #Select1 { width: 198px; } #selCities { width: 233px; } #selProvinces { width: 227px; } </style> </head> <body> 请选择你需要的省(市):<select id="selProvinces"> </select>
    请选择你需要的区(县):<select id="selCities"> </select>

    查询结果:请稍后……
    </body> </html>
  • 2011年4月29日 6:41
  • 你好,刚才那个帖子没有正常格式化,现在是格式化的帖子——

    1)如果你使用WinForm,引入这个WebService然后调用,MessageBox输出结果即可。

    2)如果是WebForm,jQuery的ajax非常适合你(异步的)——需要“天气预报”的示例代码问我要,maledong@qq.com,主题——“天气预报”AJAX示例代码

    <!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>JQuery AJAX示例代码</title>
      <!--
        本综合示例演示指定一个特定的,联动的Dropdownlist城市显示天气预报
        1)程序一开始加载
      -->
      <script src="http://ajax.microsoft.com/ajax/jquery/jquery-1.4.4.min.js" type="text/javascript"></script>
      <script>
    
        $(function () {
    
          //先获取全部的省等地方(返回一个xml的string数组)
          $.ajax({
    
            type: "post",
            url: "http://www.webxml.com.cn/webservices/weatherwebservice.asmx/getSupportProvince",
            datatype: "xml",
            success: function (result) {
              $(result).find("string").each(
                function () {
    
                  //$(this).text()的“text”方法可以获取html容器和xml容器的文字
                  $("#selProvinces").append("<option value='" + $(this).text() + "'>" + $(this).text() + "</option>");
                });
            }
          });
    
          //然后根据选择的省,加载所有的市
          $("#selProvinces").change(function () {
    
            //清空所有项目
            $("#selCities").empty();
            //动态加载
            $.ajax({
    
              type: "post",
              timeout: 1200,
              url: "http://www.webxml.com.cn/webservices/weatherwebservice.asmx/getSupportCity",
              data: "byProvinceName=" + $("#selProvinces").val(),   //给Service传递参数
              datatype: "xml",
    
              //成功加载:
              success: function (result) {
                $(result).find("string").each(function () {
    
                  $("#selCities").append("<option value='" + $(this).text() + "'>" + $(this).text() + "</option>");
    
                });
              }
            });
    
          });
    
    
          //根据动态选择的城市,查询对应的天气预报情况:
          $("#selCities").change(function () {
            $("#ulResult").empty();
    
            //因为放到Dropdownlist中的选项是“名称(编号)”,所以只要名称
            var foundcontent = $.trim($("#selCities").val().substring(0, $("#selCities").val().indexOf("(")));
    
            $.ajax({
    
              type: "post",
              url: "http://www.webxml.com.cn/webservices/weatherwebservice.asmx/getWeatherbyCityName",
              data: "theCityName=" + foundcontent,
              datatype: "xml",
    
              //准备加载(注意:S必须大写!)
              beforeSend: function () {
                $("#spResult").css("display", "block");
              },
    
              //成功了……
              success: function (result) {
    
                $(result).find("string").each(function () {
    
                  //排除第三个图片输出
                    if ($(this).text().indexOf(".gif")>0) {
                      $("#ulResult").append("<li><image src='Image/" + $(this).text() + "'/></li>");
                    }
                    else {
    									if($(this).text().indexOf(".jpg")<0)
    									{
                      $("#ulResult").append("<li>" + $(this).text() + "</li>");
    									}
                    }
                });
              },
    
              //完成了……
              complete: function () {
                $("#spResult").css("display", "none");
              }
            })
    
          });
        })
      
      </script>
      <style type="text/css">
        #Select1
        {
          width: 198px;
        }
        #selCities
        {
          width: 233px;
        }
        #selProvinces
        {
          width: 227px;
        }
      </style>
    </head>
    <body>
       请选择你需要的省(市):<select id="selProvinces">
      </select><br />
      请选择你需要的区(县):<select id="selCities">
      </select><br />
      <hr />
      查询结果:<span id="spResult" style="display: none"><font color="red">请稍后……</font></span>
      <ul id="ulResult">
      </ul>
    </body>
    </html>
    
    

    2011年4月29日 6:47
  • 我想实现这样一个需求;

     web service主动调用某个客户端的函数,结果在客户端显示。比如,弹出一个对话框什么的。

     注意:不是客户端发出请求,服务器端异步响应的这种。而是,服务器端主动去调用客户端。

     可以在服务器端配置客户端吗?或者有其他更好的思路,望高手指点!

    ASP.NET  web Service无法支持。


    WCF支持双工通信,我们也称作 发布订阅模式。

    服务可以回调那些订阅了改服务的客户端

    阅读全文-->WCF分布式开发步步为赢(10):请求应答(Request-Reply)、单向操作(One-Way)、回调操作(Call Back).


    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
     

    老徐的网站】:http://www.frankxulei.com/

    微软WCF中文技术论坛
    微软WCF英文技术论坛

    Windows Azure中文技术论坛

    • 已标记为答案 amadok 2011年7月19日 2:54
    2011年6月24日 8:15
    版主