其实关于MOSS中使用自定义WebService这种问题,google一搜会有很多很多!为什么我还要写呢? 我认为有些事情必须自己亲自做一次看到效果了,心里才踏实! 其次也当做自己的学习扎记吧! 本篇文章知识来源于 杨永刚先生的<<Sharepoint Server2007 案例实战开发>> 我不过是依葫芦画瓢而已了 :)
MOSS自带Web service
MOSS自己提供的web服务在:C:\Program Files\Common Files\microsoft shared\Web Server Extensions\12\ISAPI 目录下面
几个常用的Web 服务:
- 列表服务 : http://localhost:80/_vti_bin/Lists.asmx ==>可以完成列表的增删改查操作,访问列表视图和列表附件
- 搜索服务:http://localhost:80/_vti_bin/Lists.asmx ==>提供Query方法,构造XML查询返回结果
- UserGroup服务:http://localhost:80/_vti_bin/Lists.asmx ==>用户和用户组的增删改查,数据读取,权限设定
- Imageing服务:http://localhost:80/_vti_bin/Lists.asmx ==>管理站的中的图片库,文档库
当然里面还有很多其他webservice了,自己去挖掘!利用这些web服务,客服端程序来操作MOSS站的而不用登录网页维护!
自定义Web Service
- 新建一个 ASP.NET Web Service 项目
- 编写业务逻辑方法
- 生成disco和wsdl文件 如何生成这两个文件呢? (使用VS2008命令提示 输入: disco http://localhost:17906/MyTestWebService/Service.asmx /out:c:\moss)
- 修改disco和wsdl文件,把后缀修改为 aspx
- 把修改后的disco和wsdl文件和asmx文件复制到 C:\Program Files\Common Files\microsoft shared\Web Server Extensions\12\ISAPI 下,并把程序集放在站的下面的bin目录里面
- 运行
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Services; using Microsoft.SharePoint; using System.Data; using Microsoft.SharePoint.WebControls; [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. // [System.Web.Script.Services.ScriptService] public class Service : System.Web.Services.WebService { public Service () { //Uncomment the following line if using designed components //InitializeComponent(); } [WebMethod] public string HelloWorld() { return "Hello World"; } [WebMethod] public string GetTree() { string str = string.Empty; try { using (SPWeb web = SPControl.GetContextWeb(HttpContext.Current)) { str =”MyTest:”+ web.Name; } } catch (Exception ex) { str = "Error Message:" + ex.Message; } return str; } }
生成的Service.disco 文件:
<?xml version="1.0" encoding="utf-8"?> <discovery xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/disco/"> <contractRef ref="http://localhost:17906/MyTestWebService/Service.asmx?wsdl" docRef="http://localhost:17906/MyTestWebService/Service.asmx" xmlns="http://schemas.xmlsoap.org/disco/scl/" /> <soap address="http://localhost:17906/MyTestWebService/Service.asmx" xmlns:q1="http://tempuri.org/" binding="q1:ServiceSoap" xmlns="http://schemas.xmlsoap.org/disco/soap/" /> <soap address="http://localhost:17906/MyTestWebService/Service.asmx" xmlns:q2="http://tempuri.org/" binding="q2:ServiceSoap12" xmlns="http://schemas.xmlsoap.org/disco/soap/" /> </discovery>
修改为:
<%@ Page Language="C#" Inherits="System.Web.UI.Page" %> <%@ Assembly Name="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %> <%@ Import Namespace="Microsoft.SharePoint.Utilities" %> <%@ Import Namespace="Microsoft.SharePoint" %> <% Response.ContentType = "text/xml"; %> <discovery xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/disco/"> <contractRef ref=<% SPEncode.WriteHtmlEncodeWithQuote(Response, SPWeb.OriginalBaseUrl(Request) + "?wsdl", '"'); %> docRef=<% SPEncode.WriteHtmlEncodeWithQuote(Response, SPWeb.OriginalBaseUrl(Request), '"'); %> xmlns="http://schemas.xmlsoap.org/disco/scl/" /> <soap address=<% SPEncode.WriteHtmlEncodeWithQuote(Response, SPWeb.OriginalBaseUrl(Request), '"'); %> xmlns:q1="http://tempuri.org/" binding="q1:SPFilesSoap" xmlns="http://schemas.xmlsoap.org/disco/soap/" /> </discovery>
把修改后的文件保存为: Servicedisco.aspx
生成的 Service.wsdl 文件
<?xml version="1.0" encoding="utf-8"?> <wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://tempuri.org/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" targetNamespace="http://tempuri.org/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"> <wsdl:types> <s:schema elementFormDefault="qualified" targetNamespace="http://tempuri.org/"> <s:element name="HelloWorld"> <s:complexType /> </s:element> <s:element name="HelloWorldResponse"> <s:complexType> <s:sequence> <s:element minOccurs="0" maxOccurs="1" name="HelloWorldResult" type="s:string" /> </s:sequence> </s:complexType> </s:element> <s:element name="GetTree"> <s:complexType /> </s:element> <s:element name="GetTreeResponse"> <s:complexType> <s:sequence> <s:element minOccurs="0" maxOccurs="1" name="GetTreeResult" type="s:string" /> </s:sequence> </s:complexType> </s:element> </s:schema> </wsdl:types> <wsdl:message name="HelloWorldSoapIn"> <wsdl:part name="parameters" element="tns:HelloWorld" /> </wsdl:message> <wsdl:message name="HelloWorldSoapOut"> <wsdl:part name="parameters" element="tns:HelloWorldResponse" /> </wsdl:message> <wsdl:message name="GetTreeSoapIn"> <wsdl:part name="parameters" element="tns:GetTree" /> </wsdl:message> <wsdl:message name="GetTreeSoapOut"> <wsdl:part name="parameters" element="tns:GetTreeResponse" /> </wsdl:message> <wsdl:portType name="ServiceSoap"> <wsdl:operation name="HelloWorld"> <wsdl:input message="tns:HelloWorldSoapIn" /> <wsdl:output message="tns:HelloWorldSoapOut" /> </wsdl:operation> <wsdl:operation name="GetTree"> <wsdl:input message="tns:GetTreeSoapIn" /> <wsdl:output message="tns:GetTreeSoapOut" /> </wsdl:operation> </wsdl:portType> <wsdl:binding name="ServiceSoap" type="tns:ServiceSoap"> <soap:binding transport="http://schemas.xmlsoap.org/soap/http" /> <wsdl:operation name="HelloWorld"> <soap:operation soapAction="http://tempuri.org/HelloWorld" style="document" /> <wsdl:input> <soap:body use="literal" /> </wsdl:input> <wsdl:output> <soap:body use="literal" /> </wsdl:output> </wsdl:operation> <wsdl:operation name="GetTree"> <soap:operation soapAction="http://tempuri.org/GetTree" style="document" /> <wsdl:input> <soap:body use="literal" /> </wsdl:input> <wsdl:output> <soap:body use="literal" /> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:binding name="ServiceSoap12" type="tns:ServiceSoap"> <soap12:binding transport="http://schemas.xmlsoap.org/soap/http" /> <wsdl:operation name="HelloWorld"> <soap12:operation soapAction="http://tempuri.org/HelloWorld" style="document" /> <wsdl:input> <soap12:body use="literal" /> </wsdl:input> <wsdl:output> <soap12:body use="literal" /> </wsdl:output> </wsdl:operation> <wsdl:operation name="GetTree"> <soap12:operation soapAction="http://tempuri.org/GetTree" style="document" /> <wsdl:input> <soap12:body use="literal" /> </wsdl:input> <wsdl:output> <soap12:body use="literal" /> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name="Service"> <wsdl:port name="ServiceSoap" binding="tns:ServiceSoap"> <soap:address location="http://localhost:17906/MyTestWebService/Service.asmx" /> </wsdl:port> <wsdl:port name="ServiceSoap12" binding="tns:ServiceSoap12"> <soap12:address location="http://localhost:17906/MyTestWebService/Service.asmx" /> </wsdl:port> </wsdl:service> </wsdl:definitions>
修改为:
1.把<?xml version="1.0" encoding="utf-8"?> 修改为:
<%@ Page Language="C#" Inherits="System.Web.UI.Page" %> <%@ Assembly Name="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %> <%@ Import Namespace="Microsoft.SharePoint.Utilities" %> <%@ Import Namespace="Microsoft.SharePoint" %> <% Response.ContentType = "text/xml"; %>
2.把 wsdl:service 节点[划线部分]修改为:
<wsdl:service name="Service"> <wsdl:port name="ServiceSoap" binding="tns:ServiceSoap"> <soap:address location=<% SPEncode.WriteHtmlEncodeWithQuote(Response, SPWeb.OriginalBaseUrl(Request), '"'); %> /> </wsdl:port> <wsdl:port name="ServiceSoap12" binding="tns:ServiceSoap12"> <soap12:address location=<% SPEncode.WriteHtmlEncodeWithQuote(Response, SPWeb.OriginalBaseUrl(Request), '"'); %> /> </wsdl:port> </wsdl:service>
把文件保存为: Servicewsdl.aspx
说明: 其实上面的就是更改地址,因为最初的是固定的地址!SPEncode.WriteHtmlEncodeWithQuote(Response, SPWeb.OriginalBaseUrl(Request), '"'); %>这句其实就是获取当前请求地址!其实上面修改的代码你只需要打开C:\Program Files\Common Files\microsoft shared\Web Server Extensions\12\ISAPI 里面的任意的 两个.wsdl 和.disco 文件,把那段代码复制粘贴出来即可!
附:如何把程序集放到GAC呢? 用vs2008命令提示 输入 gacutil –if c:\dll\you.dll enter 然后 iisreset [重启IIS] enter
把Service.asmx,Servicewsdl.aspx,Servicedisco.aspx 这三个文件复制到C:\Program Files\Common Files\microsoft shared\Web Server Extensions\12\ISAPI目录下面,把该项目的程序集放在站点的bin目录里面(或者放在GAC目录里面)啰嗦一下,由于这里建的是webservice项目,你生成成功后看不到dll,只有把他发布网站的形式发布出来才有dll!
现在访问地址变为: http://server:80:/_vti_bin/Service.asmx ,如果访问正常说明自定义webservice也正常了!
不过这个地址在浏览器访问,你调用webservice的方法,他不会返回东西给你! 只有通过程序添加web 引用,在调用这个webservice!
另一个项目:
添加web引用: 地址为:http://server:80/_vti_bin/Service.asmx
MyCus.Service mcs = new MyCus.Service(); mcs.UseDefaultCredentials = true; //注意设置这个属性为true Response.Write(mcs.GetTree());
实践的时候遇到这个错误了:
Possible SOAP version mismatch: Envelope namespace http://schemas.xmlsoap.org/wsdl/ was unexpected. Expecting http://schemas.xmlsoap.org/soap/envelope/.
解决方案:
上面修改的地方只有一处 <% SPEncode.WriteHtmlEncodeWithQuote(Response, SPWeb.OriginalBaseUrl(Request) + "?wsdl", '"'); %> 后面加wsdl! 由于我的大意! 把所有的地方的复制为一样的了!
经过我的测试! 一切ok!