好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

客户端调用Spring.Net发布的WebService

客户端调用Spring.Net发布的WebService

主要 Spring.Net发布的WebService基于接口发布调用问题。

 

目录  .Net客户端调用

Ajax调用

 

1、.Net客户端调用

对于类似前一节中通过接口规范发布的服务,在.Net中可以通过松散的调用来完成。松散到什么程度呢?

只需要两个条件:1、WebService地址 2、服务接口程序集。

调用过程如下:

 

<objects xmlns= " http://www.springframework.net "  xmlns:aop= " http://www.springframework.net/aop " >
            < object  id= " person "  type= " Spring.Web.Services.WebServiceProxyFactory,Spring.Services " >
                <!--地址-->
                <property name= " ServiceUri "  value= " http://localhost:53825/PersonService.asmx " ></property>
                <!--服务接口-->
                <property name= " ServiceInterface "  value= " SpringWebServiceIoCContract.IPerson, SpringWebServiceIoCContract " />
            </ object >
            < object  id = " personObj "  type= " SpringWebServiceIoCContract.Person,SpringWebServiceIoCContract " ></ object ></objects> 

 

调用过程就比较简单了:

 

     using  (IApplicationContext context = ContextRegistry.GetContext())
            {
                 var  person0 = context.GetObject( " person " )  as  IPerson;
                 if  ( null !=person0)
                {
                    Console.WriteLine(person0.Add( 1 ,  2 ));
                }

   } 

 

输出:

 

2、Ajax调用

ajax的调用即显得稍显麻烦(可能是我还没有发现最佳的调用方式),我这里只列出调用方式供参考

之前调用传统的WebService:

    $.ajax({
            type:  " POST " ,
            url:  " WebService1.asmx/GetPerson " ,
            dataType:  " json " ,
            contentType:  " application/json; charset=utf-8 " ,
            success: function (json) { $(json.d).each(function () { alert( this .Name +  " - "  +  this .Age ) }) },
            error: function (error) {
                alert( " 调用出错 "  + error.responseText);
            }
        });

success时,返回的数据就是json类型的。

但如果通过Spring.Net发布的Web Service ,我们的配置文件中对httpModule以及HttpHandler的重新配置已经改变了客户端请求WebService调用时的

处理模块了,如果在的配置如下:

 

        <httpHandlers>    

<add verb= " * "  path= " *.asmx "  type= " Spring.Web.Services.WebServiceHandlerFactory, Spring.Web " />
        </httpHandlers>
        <httpModules>
            <add name= " SpringModule "  type= " Spring.Context.Support.WebSupportModule, Spring.Web " />
        </httpModules>

还通过这种 方式调用会产生问题,如下图:

 

好在Spring.Net中同时提供了Spring.Web.Extensions程序集,如果有HttpModule过滤后的模块交给它处理就没有问题。此时,我们的配置应该是:

 

        <httpHandlers>    

<add verb= " * "  path= " *.asmx "  type= " Spring.Web.Script.Services.ScriptHandlerFactory, Spring.Web.Extensions " />
        </httpHandlers>
        <httpModules>
            <add name= " SpringModule "  type= " Spring.Context.Support.WebSupportModule, Spring.Web " />
        </httpModules>

 

这时,我们上述Ajax方式调用传统的Web Service就没有问题。

提示:.Net客户端(ConsoleApplication)调用也能成功。

 

问题是,使用Spring.Web.Extensions,我们能调用Spring.Net发布的WebServicve 吗。?

我们将上述Ajax调用的url换成PersonService.asmx,如下:

 

          $.ajax({

    type:  " POST " ,
            url:  " PersonService.asmx/GetPerson " ,
            dataType:  " json " ,
            contentType:  " application/json; charset=utf-8 " ,
            success: function (json) { $(json.d).each(function () { alert( this .Name +  " - "  +  this .Age) }) },
            error: function (error) {
                alert( " 调用出错 "  + error.responseText);
            }
        });

这时问题就出来了:

 

从中我们可以看出:PersonService.asmx/GetPerson是能调用成功的,只是JSON转换的时候出现异常。

 

 

解决方式:

将IPerson接口中的GetPerson返回string类型,通过JsonConvert.SerializeObject进行转换,如下:

 

public   string  GetPerson( string  name)       

 {
            Person person =  new  Person { Age =  25 , Name =  " zhangsan "  };
             return  JsonConvert.SerializeObject(person);
        }

Ajax调用:

 

       $.ajax({

    type:  " POST " ,
            url:  " PersonService.asmx/GetPerson " ,
            data: { name:  ' a '  },
            dataType:  " JSON " ,
            success: function (json) {
                alert( new  Function( " return  "  + json.replace(/<[^>]+>|[\r\n]/g,  "" ))().Name)
            },            
            error: function (error) {
                alert( " 错误: "  + error.responseText);
            }
        });

这样就调用成功。

 

看看下图中和调用传统WebService的区别:

注意:传统WebService调用,dataType: "json",而现在dataType: "JSON"。"JSON"大小写区分.

 

还有一种AJAX调用的方式:通过<scriptManager>来进行

在如下配置:即

<add verb="*" path="*.asmx" type="Spring.Web.Script.Services.ScriptHandlerFactory, Spring.Web.Extensions"/>可以通过

 

PersonService.GetPerson(name, GetDataOnSucceeded);
function GetDataOnSucceeded()
{
    alert( " 姓名: "  + result.Name +  " \n "  +  " 年龄: "  + result.Age);    
}

调用结果如下:

 

 

分类:  Spring.Net

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于客户端调用Spring.Net发布的WebService的详细内容...

  阅读:60次