www.91084.com

GVKun编程网logo

调用WebService出错(调用webservice出错是什么意思)

5

本文的目的是介绍调用WebService出错的详细情况,特别关注调用webservice出错是什么意思的相关信息。我们将通过专业的研究、有关数据的分析等多种方式,为您呈现一个全面的了解调用WebSer

本文的目的是介绍调用WebService出错的详细情况,特别关注调用webservice出错是什么意思的相关信息。我们将通过专业的研究、有关数据的分析等多种方式,为您呈现一个全面的了解调用WebService出错的机会,同时也不会遗漏关于.net 异步调用webservice 并取得Webservice返回结果、Asp.net Webservice – 使用jquery AJAX安全地调用webservice、ASP.NET中WebService的创建和部署以及通过反射动态调用WebService、Axis2 webservice 之使用java调用webservice的知识。

本文目录一览:

调用WebService出错(调用webservice出错是什么意思)

调用WebService出错(调用webservice出错是什么意思)

调用一个远程WebService编译出错:


错误    1    类型“System.Web.Services.Protocols.soapHeader”在未被引用的程序集中定义。必须添加对程序集“System.Web.Services,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a”的引用。    F:\360云盘\项目+总结\后台程序\腾讯搜搜_API_推广后台\soso_api\api_ws\api_ws\Service References\api_AccountService\Reference.cs    1273    26    api_ws

解决方法:

在项目中添加对 System.Web.WebService的引用。

.net 异步调用webservice 并取得Webservice返回结果

.net 异步调用webservice 并取得Webservice返回结果

在.net中,为我们提供了一种异步调用WebService的方法,我们在用wsdl.exe 生成代理类后,可爱的wsdl.exe为我们的代理类添加了很多事件方法,下面我给大家分享下我异步调用代码的过程...
代理类大家就直接去生成了哈。。

 

 

还有,插句话,利用webservice,我们也可以上传和下载一些比较小的文件,数据以字节流的(byte[])方式进行传送,我是在tomcat5.5 .net 3.5环境下做的测试,10多M的数据上传和下载都不会存在问题,利用这点又为我们在CS端上传和下载图片除了使用WebClient API又提供了另外一种方法。。

Asp.net Webservice – 使用jquery AJAX安全地调用webservice

Asp.net Webservice – 使用jquery AJAX安全地调用webservice

我想在Ajax上使用webservices.使用ajax调用webservice时,安全性的最佳方法是什么?我想防止远程调用应用程序.

我有以下web服务,例如:

[WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolBoxItem(false)]
    [System.Web.Script.Services.ScriptService]
    public class Users : System.Web.Services.WebService
    {

        [WebMethod]
        public List<User> GetUsers()
        {
            List<User> listUsers = new List<User>();
            User user = new User();
            user.Id = 1;
            user.Name = "John";

            User user2 = new User();
            user2.Id = 2;
            user2.Name = "Martin";


            listUsers.Add(user);
            listUsers.Add(user2);

            return listUsers;
        } 
    }
}

我用jquery ajax调用webservice:

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

        getUsers();


        function getUsers() {

            $.ajax({
                type: "POST",url: "Webservices/Users.asmx/GetUsers",data: "{}",contentType: "application/json; charset=utf-8",dataType: "json",success: function (response) {

                    var users = response.d;

                    $.each(users,function (index,user) {

                        console.log(user.Name);

                    });

                },failure: function (msg) {
                }
            });
        }
    });
</script>

解决方法

没有最好的方式,答案总是取决于它,尽管它非常无益.例如,您可以使用 forms authentication.如果使用Web服务和Web服务的Web应用程序是同一ASP.NET应用程序的一部分,则浏览器可以为每次调用Web服务无缝地发送表单身份验证票证(cookie).

在配置文件中,您可以拥有

<authorization>
        <deny users="?" />
</authorization>

这将拒绝匿名用户访问,也将覆盖Web服务.换句话说,除非用户登录并获得带有故障单的有效cookie,否则无法使用服务.当然,您必须使用HTTPS.否则,中间的任何人都可以在标题中获取cookie并致电您的服务.

最后,无法确保在绝对意义上没有人在您的应用程序之外调用Web服务.上述方法确保中间没有人调用您的服务.但是没有办法确保有效用户直接在您的应用程序之外调用服务,因为Web服务调用者是JavaScript,并且用户可以通过查看脚本或甚至查看脚本轻松找出您在JavaScript中构建的任何安全性.来自浏览器的流量.任何具有一定技术性的最终用户都可以重播请求或修改请求,并使用有效凭据提交给您的Web服务.

编辑:-

以下是您要启用FormsAuthentication的详细信息.

(1)在Web.config中,在< system.web>下,确保你有这个.

<authentication mode="Forms">
     <forms loginUrl="Login.aspx" defaultUrl="~/" />
</authentication>
<authorization>
     <deny users="?" />
</authorization>

这将确保所有未经过身份验证的(匿名)用户重定向到Login.aspx.

(2)使用您的登录逻辑实现Login.aspx以获取用户ID和密码,并根据数据库或其他任何方式验证它们.一旦身份验证成功,即用户输入的ID和密码与您在数据库中的内容匹配,可以在登录按钮单击处理程序中设置故障单.

protected void Button1_Click(object sender,EventArgs e)
{
    // Do all your login logic here
    // once user ID and password entered by the user are okay,call this

    string ticket = FormsAuthentication.Encrypt(
                        new FormsAuthenticationTicket("userId",false,15));
    HttpCookie FormsCookie = new HttpCookie(
               FormsAuthentication.FormsCookieName,ticket) { HttpOnly = true };
    HttpContext.Current.Response.Cookies.Add(FormsCookie);
}

(3)将PrincipalPermissionAttribute添加到这样的Web方法中.

public class Users : System.Web.Services.WebService
{
    [PrincipalPermissionAttribute(SecurityAction.Demand)]
    [WebMethod]
    public List<User> GetUsers()
    {
        // Same code as what you have Now
    }
}

如果您现在转到任何页面,您将被重定向到login.aspx,您需要输入用户ID和密码并登录.登录时,将创建表单身份验证cookie并将其写入响应.从那时起,对您的应用程序的所有请求都将引入cookie(浏览器将为您执行此操作).如果您没有登录,如果直接转到Web服务,您仍将被重定向到登录页面.正如我在原始答案中提到的,登录用户仍然可以直接访问Web服务.如果JavaScript可以做某事,用户也可以这样做.

顺便说一句,Web服务(asmx)是一种弃用的技术.

ASP.NET中WebService的创建和部署以及通过反射动态调用WebService

ASP.NET中WebService的创建和部署以及通过反射动态调用WebService

一、在ASP.NET中创建WebService

首先我们先创建一个ASP.NET Web 应用程序,此处我们以VS2017为例

点击新创建的项目,右键添加新建项,选择Web服务,输入名称后点击添加

这样我们基础的WebService就创建好了

接下来我们填加一个webservice的测试方法,并且打上特性标签WebMethod

只有打上特性标签WebMethod并且访问修饰符设置为public后外部才能调用到该方法

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;

namespace TianYa.DotNetShare.WebServiceDemo
{
    /// <summary>
    /// WebServiceTest 的摘要说明
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    // 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消注释以下行。 
    // [System.Web.Script.Services.ScriptService]
    public class WebServiceTest : System.Web.Services.WebService
    {

        [WebMethod]
        public string HelloWorld()
        {
            return "Hello World";
        }

        /// <summary>
        /// WebService测试方法
        /// </summary>
        /// <param name="paramIn">入参</param>
        /// <param name="paramOut">出参</param>
        /// <returns>返回值</returns>
        [WebMethod(Description = "WebService测试方法")]
        public string SayHello(string paramIn, ref string paramOut)
        {
            paramOut = string.Format("Hello {0}!", paramIn);
            return "Success";
        }
    }
}

到此我们的WebService就创建完毕了,很简单吧!

二、将创建的WebService部署到我们的IIS上面

其实WebService部署和我们的网站部署是一样的,下面就简单的介绍下

首先我们需要先配置域名解析,修改hosts文件

hosts文件路径:C:\Windows\System32\drivers\etc

以记事本方式打开,配置方式如下,格式:127.0.0.1 一个空格 自定义的域名 ,配置完成后记得保存

接下来我们添加一个公用的应用程序池,点击“应用程序池”右键“添加应用程序池”

选择完后点击确定,然后点击生成的应用程序池右键选择高级设置,将标识改成LocalSystem,点击确定

设置完成后效果如下

最后就是添加网站了,点击“网站”右键选择“添加网站”

物理路径就是指我们的项目路径,弄完后点击确定

到此我们的WebService就全部部署好了,下面测试一下是否成功

浏览器访问正常,说明我们WebService部署成功啦!

三、通过反射动态调用WebService

此处为了演示,首先我们添加一个WebService的帮助类WebServiceHelper.cs

具体代码如下:

using System;
using System.Net;
using System.IO;
using System.CodeDom;
using System.CodeDom.Compiler;
using System.Web.Services.Description; //需导入System.Web.Services程序集(添加引用)
using Microsoft.CSharp;

namespace TianYa.DotNetShare.WebServiceDemo
{
    public static class WebServiceHelper
    {
        #region 通过反射动态调用WebService

        #region 调用示例
        /************************************************************************************
         * 
         * WebService方法:
         * [WebMethod(Description = "WebService测试方法")]
         * public string SayHello(string paramIn,ref string paramOut)
         * {
         *      paramOut = string.Format("Hello {0}!", paramIn);
         *      return "Success";
         * }
         * 
         * 调用示例如下:
         * object[] objs = new object[] { "张三", "" }; //入参
         * var webServiceUrl = "http://TianYa.DotNetShare.WebServiceDemo/WebServiceTest.asmx";
         * object result = WebServiceHelper.InvokeWebService(webServiceUrl, "SayHello", objs); //返回结果
         * object paramOut = objs[1]; //出参
         * 
         ************************************************************************************/
        #endregion

        /// <summary>
        /// 通过反射动态调用WebService
        /// </summary>
        /// <param name="webServiceUrl">WebServices地址</param>
        /// <param name="methodName">调用的方法名</param>
        /// <param name="args">把调用WebService时需要的参数按顺序放到这个object[]里,如果无参数传null</param>
        /// <returns>返回调用WebService的返回值,如果调用出错则返回null</returns>
        public static object InvokeWebService(string webServiceUrl, string methodName, params object[] args)
        {
            //这里的namespace是需要引用的WebService的命名空间,不用改也可以正常使用。也可以加一个参数从外面传进来。
            string @namespace = "client";

            try
            {
                //判断webServiceUrl中末尾是否包含“?WSDL”,如果不包含则添加
                if (webServiceUrl != null && !webServiceUrl.Equals(""))
                {
                    if (webServiceUrl.LastIndexOf("?") > -1)
                    {
                        if (webServiceUrl.ToUpper().LastIndexOf("WSDL") <= -1)
                        {
                            webServiceUrl = webServiceUrl + "WSDL";
                        }
                    }
                    else
                    {
                        webServiceUrl = webServiceUrl + "?WSDL";
                    }
                }

                //获取WSDL
                WebClient wc = new WebClient();
                Stream stream = wc.OpenRead(webServiceUrl);
                ServiceDescription sd = ServiceDescription.Read(stream);
                string className = sd.Services[0].Name;
                ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();
                sdi.AddServiceDescription(sd, "", "");
                CodeNamespace cn = new CodeNamespace(@namespace);

                //生成客户端代理类代码
                CodeCompileUnit ccu = new CodeCompileUnit();
                ccu.Namespaces.Add(cn);
                sdi.Import(cn, ccu);
                CSharpCodeProvider csc = new CSharpCodeProvider();
                //ICodeCompiler icc = csc.CreateCompiler();

                //设定编译参数
                CompilerParameters cpList = new CompilerParameters();
                cpList.GenerateExecutable = false;//动态编译后的程序集不生成可执行文件
                cpList.GenerateInMemory = true;//动态编译后的程序集只存在于内存中,不在硬盘的文件上
                cpList.ReferencedAssemblies.Add("System.dll");
                cpList.ReferencedAssemblies.Add("System.XML.dll");
                cpList.ReferencedAssemblies.Add("System.Web.Services.dll");
                cpList.ReferencedAssemblies.Add("System.Data.dll");

                //编译代理类
                CompilerResults cr = csc.CompileAssemblyFromDom(cpList, ccu);
                if (true == cr.Errors.HasErrors)
                {
                    System.Text.StringBuilder sb = new System.Text.StringBuilder();
                    foreach (System.CodeDom.Compiler.CompilerError ce in cr.Errors)
                    {
                        sb.Append(ce.ToString());
                        sb.Append(System.Environment.NewLine);
                    }

                    //错误日志处理
                    throw new Exception(sb.ToString());
                }

                //生成代理实例,并调用方法
                System.Reflection.Assembly assembly = cr.CompiledAssembly;
                Type t = assembly.GetType(@namespace + "." + className, true, true);
                object obj = Activator.CreateInstance(t);
                System.Reflection.MethodInfo mi = t.GetMethod(methodName);

                //注:method.Invoke(obj, null)返回的是一个Object,
                //如果你服务端返回的是DataSet,这里也是用(DataSet)method.Invoke(obj, null)转一下就行了,
                //method.Invoke(obj,null)这里的null可以传调用方法需要的参数,string[]形式的
                return mi.Invoke(obj, args);
            }
            catch (Exception ex)
            {
                //异常日志处理
                return null;
            }
        }
        #endregion
    }
}

在Index页面调用

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace TianYa.DotNetShare.WebServiceDemo
{
    public partial class Index : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            //调用示例如下:
            object[] objs = new object[] { "张三", "" }; //入参
            var webServiceUrl = "http://TianYa.DotNetShare.WebServiceDemo/WebServiceTest.asmx";
            object result = WebServiceHelper.InvokeWebService(webServiceUrl, "SayHello", objs); //返回结果
            object paramOut = objs[1]; //出参

            Response.Write($"调用结果result:{result}<br/>出参结果paramOut:{paramOut}");
        }
    }
}

页面输出结果:

至此就全部介绍完了,如果你觉得这篇文章对你有所帮助请记得点赞哦,谢谢!!!

 WebService的Demo源码:

链接:https://pan.baidu.com/s/1dFYNVYNw3a_4TKwwSToadA
提取码:feg8

 

参考博文:https://www.cnblogs.com/atree/p/WebService_dynamic.html

版权声明:如有雷同纯属巧合,如有侵权请及时联系本人修改,谢谢!!!

Axis2 webservice 之使用java调用webservice

Axis2 webservice 之使用java调用webservice

在上一篇中写了一个简单了webservice,实现了一个sayHello功能。那么webservice写好之后我们如何使用Java程序来调用webservice呢?

一、java调用的webservice的第一种方式:RPC调用AXIS2 webservice
    下面这个方法是我抽象出来的一个方法,

import javax.xml.namespace.QName;

 org.apache.axis2.AxisFault;
 org.apache.axis2.addressing.EndpointReference;
 org.apache.axis2.client.Options;
 org.apache.axis2.rpc.client.RPCServiceClient;

public class Client {

    /**
     * @param args
     * @throws Exception
     */
    static void main(String[] args) throws Exception {
        // 调用PublishWebService
        String wsdlUrl = "http://localhost:8080/DigitalProduct/services/PublishWebService?wsdl";//webservice地址
        String method = "updatePublishSysParam"; //调用的那个方法
        Object[] param = new Object[] { "AASSDDFF" };//传递的参数值
        String namespaceUrl1 = "http://service.digitalproduct.tkbs.com";//命名空间
        Class[] opReturnType1 = new Class[] { String[]. };//返回值类型
        String result = axis2RPCInvoke(wsdlUrl,method,param,namespaceUrl1,opReturnType1);
        System.out.println(result);
    }

     * RPC调用AXIS2 webservice
     * 
     *  wsdlUrl
     *            服务地址 如:http://192.168.0.1:2597/aixs2/services/jqservice?wsdl
     *  methodName
     *            方法名 如<xs:element name="Receive">
     *  parameter
     *            方法参数 如Object[] opArgs = new Object[] { param };
     *  namespaceURI
     *            命名空间 如 :targetNamespace="http://server.test.com.cn">
     *  returnType
     *            返回类型 如字符串:Class[] opReturnType = new Class[] { String[].class
     *            };
     static String axis2RPCInvoke(String wsdlUrl,String methodName,Object[] parameter,String namespaceURI,Class[] returnType) {
        Object[] ret = null;
        RPCServiceClient serviceClient = ;
        try {
            /*
             * 此处RPCServiceClient 对象实例建议定义成类中的static变量 ,否则多次调用会出现连接超时的错误。
             */
            serviceClient = new RPCServiceClient();
            Options options = serviceClient.getoptions();
            EndpointReference targetEPR =  EndpointReference(wsdlUrl);
            options.setTo(targetEPR);
            QName opQName =  QName(namespaceURI,methodName);
            ret = serviceClient.invokeBlocking(opQName,parameter,returnType);
             System.out.println(((String[]) ret[0])[0]);
        } catch (AxisFault e) {
            e.printstacktrace();
        }
        return ((String[]) ret[0])[0];
    }
}

二、使用java调用webservice的第二种方式:使用myeclipse中的axis2插件生成客户端代码

new -->others到如下界面:

    点next 到如下界面:

现在我们想生成调用webservice的客户端代码,首先我们需要生成一个service.wsdl文件,选择第2个,点next,

在界面里边点击add folder 选择项目--》webroot--》webinf-->classes,输入好webservice那个类的全名后点击Test Class Loading ,这时候如果你选择的路径是对的,类全名是对的,就可以点next,否则next按钮式灰色的。如图:

然后点击next,这个界面中的内容基本不用修改,有一个service name,你可以改成你自己取。

继续点next 在界面中选择wsdl文件的输出路径,选择第一个,就是输出到当前的workspace,的某个项目下,选择第二个,就是输出到系统文件夹中,例如你可以选择桌面。

这里我选择第二个,然后点browse选择桌面,点finish,会看到桌面上有一个service.wsdl文件。

 

下面我们就可以根据这个wsdl文件生成客户端代码了。

首先建一个java项目,例如取名myclient

new -->others-->

选择第1个,点next.

在界面中点 browse找到你刚才生成service.wsdl文件。

点next,这个界面不用管,继续点next

这个时候需要选择代码生成的地方,选择当前工作的workspace,然后选择刚才新建的myclient如图:

点finsh,刷新myclient项目会看到src下多了两个java文件:TestServiceCallbackHandler   和 TestServiceStub

接下来就可以写java代码调用了,如下:

 myservice.service.TestServiceStub;

 Test {

     Exception 
      Todo Auto-generated method stub
        初始化Sub类
        TestServiceStub stub =  TestServiceStub();
        传递AxisServiceStub.ShowName对象,相关参数在这边赋值。
        TestServiceStub.SayHello command =  TestServiceStub.SayHello();
        command.setName("zhangsan");
        取得返回值
        String name = stub.sayHello(command).get_return();
        System.out.println(name);
    }

}

 

如此,第二种方式就写完了。

公司几个同事都喜欢第二种。但是,我个人喜欢用第一种。第二种方式如果插件使用熟练的话,很快就可以生产客户端代码,然后测试代码也可以很快写出来。

注:可能会出现错误,根据我的经历的错误经验,有以下情况:

    1.tomcat端口问题,你打开刚才插架自动生成的TestServiceStub 类 ctrl+f查找 http://localhost,查到后看他后面的端口是多少,是不是8080,?好像生成的就是8080,但是我们的tomcat可能被自己修改过,端口可能不是8080,所以这里你要改这个端口。

    2.spring的注入问题,如果你写的webservice是在spring整合的环境下,可能会报错误,一般是由 spring注入失败,导致xxxService类注入失败。关于这个我下一篇会详细解释。

    3.一切都正常,打断点调试看到方法执行成功了、执行完毕了,但是并没有成功的返回我们要的结果,而是报超时了,这时候,我们需要在TestServiceStub 中加入一行代码

        这行代码的作用是 规定超时时间 是多长,例如你可以设为10分钟。_operationClient.getoptions().setTimeOutInMilliSeconds(600000L);  //600*1000毫秒(10分钟

      我感觉这样设置不合理,但是可以解决这个错误,让你的程序运行成功,看到运行成功返回的结果。才有继续学习的劲头啊。

   

 

 

 

关于调用WebService出错调用webservice出错是什么意思的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于.net 异步调用webservice 并取得Webservice返回结果、Asp.net Webservice – 使用jquery AJAX安全地调用webservice、ASP.NET中WebService的创建和部署以及通过反射动态调用WebService、Axis2 webservice 之使用java调用webservice等相关知识的信息别忘了在本站进行查找喔。

本文标签: