soapclient(php SoapClient 是什么)
各位老铁们好,相信很多人对soapclient都不是特别的了解,因此呢,今天就来为大家分享下关于soapclient以及php SoapClient 是什么的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!
php SoapClient 是什么
SOAP:简单对象访问协议,简单对象访问协议(SOAP)是一种轻量的、简单的、基于 XML的协议,它被设计成在 WEB上交换结构化的和固化的信息。
PHP5中的这个SOAP扩展目的是为了实现PHP对Web services的支持。与其它实现PHP对Web services的支持的方法不同,SOAP扩展是用C写的,因此它比其它方法具有速度优势。
php SoapClient就是可以基于SOAP协议访问webservice的php客户端。nusoap是一个可以提供Soap访问的类库,下载地址:http://sourceforge.net/projects/nusoap
为什么SoapClient的mssoapinit方法会失败
我在asp.net下构建了一个Web Service-->Service1,其中一个方法TestAddition是得到两个数字的和,但是在asp页面中利用SoapToolkit2.0的创建MSSOAP.SoapClient对象,要用mssoapinit方法初始化失败,Web Service的程序如下:
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Web;
using System.Web.Services;
namespace WebService
{
///<summary>
/// Service1的摘要说明。
///</summary>
public class Service1: System.Web.Services.WebService
{
public Service1()
{
//CODEGEN:该调用是 ASP.NET Web服务设计器所必需的
InitializeComponent();
}
#region组件设计器生成的代码
//Web服务设计器所必需的
private IContainer components= null;
///<summary>
///设计器支持所需的方法-不要使用代码编辑器修改
///此方法的内容。
///</summary>
private void InitializeComponent()
{
}
///<summary>
///清理所有正在使用的资源。
///</summary>
protected override void Dispose( bool disposing)
{
if(disposing&& components!= null)
{
components.Dispose();
}
base.Dispose(disposing);
}
#endregion
// WEB服务示例
// HelloWorld()示例服务返回字符串 Hello World
//若要生成,请取消注释下列行,然后保存并生成项目
//若要测试此 Web服务,请按 F5键
// [WebMethod]
// public string HelloWorld()
//{
// return"Hello World";
//}
[WebMethod]
public string TestAddition(int a,int b)
{
int c;
c= a+ b;
return c.ToString();
}
}
}
asp中页面的代码如下:
<%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%>
<%
Dim drmSoapClient
Dim res
Const WSDL_URL="http://localhost/WebService/Service1.asmx?wsdl"
Set drmSoapClient= CreateObject("MSSOAP.SoapClient")
drmSoapClient.ClientProperty("ServerHTTPRequest")= true
drmSoapClient.mssoapinit"http://localhost/WebService/Service1.asmx?wsdl","Service1","Service1Soap"
res= drmSoapClient.TestAddition(23,34)
Response.Write(res)
%>
错误信息如下:
Microsoft VBScript编译器错误错误'800a03f6'
缺少'End'
/iisHelp/common/500-100.asp,行242
Server错误'80070057'
WSDLReader:Analyzing the WSDL file failed HRESULT=0x80004005- WSDLReader:Initialization of service failed HRESULT=0x80004005- WSDLService:Initialization of the port for service Service1 failed HRESULT=0x80004005- WSDLPort:Analyzing the binding information for port Service1Soap failed HRESULT=0x80004005- WSDLPort:An operation for port Service1Soap could not be initialized HRESULT=0x80004005- WSDLOperation:Initializing of the input message failed for operation TestAddition HRESULT=0x80004005- WSDLOperation:Initialization of a SoapMapper for operation TestAddition failed HRESULT=0x80004005- SoapMapper:The schema definition for SoapMapper TestAddition could not be found HRESULT=0x80004005
/DRMClient/WebServiceTest/TestAddition.asp,行9
VB通过SoapClient调用WS,怎么设置超时
我们都知道,调用WS可以在工程中添加对WS的WEB引用。
但是,如果我们不想通过添加引用的方式,而是在代码中动态引用该怎么办呢看
首先,我们该想到WS的实现也是一个类的形式。
其次,WS在传输过程中是通过WSDL来进行描述的(使用SOAP协议)。
因此,我们需要获取WS的WSDL描述,并通过该描述来动态生成程序集。
最后:通过反射来获取新生成的程序集,并调用其方法!
上述步骤需要引用如下四个名称空间:
using System.Web.Services.Description;//WS的描述
//以下几个用于根据描述动态生成代码并动态编译获取程序集
using System.CodeDom;
using Microsoft.CSharp;
using System.CodeDom.Compiler;
上述几个名称空间中包括如下几个重要的类:
using System.Web.Services.Description下:
ServiceDescription//WS描述
ServiceDescriptionImporter//通过描述生成客户端代理类,特别注意其中的Style
以下是MSDN对其的
XML Web services的接口通常由 Web服务描述语言(WSDL)文件来说明。例如,若要获取有关使用处公开的 ASP.NET的 Web服务的 WSDL说明,只需导航到?WSDL。使用 ServiceDescriptionImporter类可以方便地将 WSDL说明中包含的信息导入到System.CodeDom.CodeCompileUnit对象。通过调整 Style参数的值,可以指示 ServiceDescriptionImporter实例生成客户端代理类(通过透明调用该类可提供 Web服务的功能)或生成抽象类(该类封装 Web服务的功能而不实现该功能)。如果将 Style属性设置为 Client,则 ServiceDescriptionImporter生成客户端代理类,通过调用这些类来提供说明的 Web服务的功能。如果将Style属性设置为 Server,则 ServiceDescriptionImporter实例生成抽象类,这些类表示所说明的 XML Web services的功能而不进行实现。然后,可以通过编写从这些抽象类继承的类来对其进行实现,并实现相关的方法。
using System.CodeDom下:
CodedomUnit//它用于设定动态代码的名称空间,类名等,可以通过ServiceDescriptionImporter.Import()方法将WS的描述代码写入该类,以作动态编译用
using System.CodeDom.Compiler下:
CodedomProvider//用于创建和检索代码生成器和代码编译器的实例,我们主要用到其实现子类CShareCodeProvider
可以直接用CShareCodeProvider provider=new CShareCodeProvider()来生成,或者用CodedomProvider.CreateProvider("CSharp")来生成
ICodeCompiler//用于编译基于 System.CodeDom的源代码表示形式。
它通过CodedomProvider的CreateCompiler()方法来
CompilerResults//表示从编译器返回的编译结果。它由ICodeCompiler根据指定的编译器设置从指定的 CodeCompileUnit所包含的 System.CodeDom树中编译程序集并返回。CompiledAssembly属性指示编译的程序集。
了解如上信息后,就可动态调用WS了。
文章分享到这里,希望我们关于soapclient的内容能够给您带来一些新的认识和思考。如果您还有其他问题,欢迎继续探索我们的网站或者与我们交流,我们将尽力为您提供满意的答案。