Moss自定义webservice
2011-06-28 10:11
302 查看
自定义一个web Service,在这个web service中自定义函数,实现业务需求的数据,这个过程就可以调用对像模型帮忙处理数据了。开发好后,将这个web service部置到moss服务器上。这时,客户端就可以引用web service的方式,实现客户端与服务器端的数据交互。
具体的实现过程如下:
一:建立Webservice项目
1.使用vs2008建立一个webserivce项目来实现我们的webservice,如下图所示:
为workflowRemind.asmx编写代码如下:
Code
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Xml.Linq;
using Microsoft.SharePoint;
namespace MossWS
{
/// <summary>
/// WorkflowRemind 的摘要说明
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ToolboxItem(false)]
// 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。
// [System.Web.Script.Services.ScriptService]
public class WorkflowRemind : System.Web.Services.WebService
{
[WebMethod]
public string HelloWorld()
{
return "Hello World";
}
public SPUser GetSPUser(string UserName, string Domain, string SiteUrl)
{
SPUser user = null;
using (SPSite siteColl = new SPSite(SiteUrl))
{
Domain = Context.User.Identity.Name.Split('\\')[0];
user = siteColl.RootWeb.AllUsers[Domain + "\\" + UserName];
}
return user;
}
[WebMethod]
public int getWorkflowApproveCount(string UserName, string Password, string Domain, string SiteUrl)
{
SPUser user = GetSPUser(UserName, Domain, SiteUrl);
int returnCount = 0;
using (SPSite siteColl = new SPSite(SiteUrl))
{
SPWeb web = siteColl.OpenWeb("/workflowmodule");
string query = "<Where>"
+ " <And>"
+ " <Eq>"
+ " <FieldRef Name=\"_x5f53__x524d__x5ba1__x6279__x4e\" LookupId=\"TRUE\"/>"
+ " <Value Type=\"User\">" + user.ID + "</Value>"
+ " </Eq>"
+ " <Eq>"
+ " <FieldRef Name=\"_x72b6__x6001_\" />"
+ " <Value Type=\"Choice\">未启动</Value>"
+ " </Eq>"
+ " </And>"
+ " </Where>";
SPQuery spq = new SPQuery();
spq.Query = query;
SPListItemCollection items = web.Lists["workflowRecord"].GetItems(spq);
returnCount = items.Count;
}
return returnCount;
}
}
}
二.生成.wsdl,.disco文件
(1).copy webservice生成的bin到要部署的sharepoint 网站的虚拟目录bin下
(2).打开layouts目录(layouts地址C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\LAYOUTS),拷贝webservice下的.asmx文件到layouts下
(3).开始--运行,输入cmd,转向layouts目录,运行
[align=left] disco http://服务器:端口号/_layouts/WorkflowRemind.asmx[/align] [align=left]注:若没有disco.exe文件,则需要安装microsoft sdks,打开C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin,拷贝disco.exe到layouts目录下,运行disco http://服务器:端口号/_layouts/WorkflowRemind.asmx。[/align] [align=left]完成后会生成webservice文件WorkflowRemind.disco和WorkflowRemind.wsdl文件。[/align]
三、修改.wsdl,.disco文件
1.将WorkflowRemind.disco和WorkflowRemind.wsdl文件中的<?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"; %>
[align=left] 实际上就是把原来的纯xml变换成为一个page来解析。并且这个页面的解析是通过moss处理的。 [/align]
[align=left] 2.将WorkflowRemind.disco中的[/align]
<contractRef ref="http://moss/_layouts/WorkflowRemind.asmx?wsdl" docRef="http://moss/_layouts/WorkflowRemind.asmx" xmlns="http://schemas.xmlsoap.org/disco/scl/" />
<soap address="http://moss/_layouts/WorkflowRemind.asmx" xmlns:q1="http://tempuri.org/" binding="q1:WorkflowRemindSoap" xmlns="http://schemas.xmlsoap.org/disco/soap/" />
<soap address="http://moss/_layouts/WorkflowRemind.asmx" xmlns:q2="http://tempuri.org/" binding="q2:WorkflowRemindSoap12" xmlns="http://schemas.xmlsoap.org/disco/soap/" />
[align=left] 替换为:[/align]
<contractRef ref=<% SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(SPWeb.OriginalBaseUrl(Request) + "?wsdl"),Response.Output); %> docRef=<% SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(SPWeb.OriginalBaseUrl(Request)), Response.Output); %> xmlns="http://schemas.xmlsoap.org/disco/scl/" />
<soap address=<% SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(SPWeb.OriginalBaseUrl(Request)),Response.Output); %> xmlns:q1="http://tempuri.org/" binding="q1:HelloWorld" xmlns="http://schemas.xmlsoap.org/disco/soap/" />
<soap address=<% SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(SPWeb.OriginalBaseUrl(Request)),Response.Output); %> xmlns:q2="http://tempuri.org/" binding="q2:ServiceSoap12" xmlns="http://schemas.xmlsoap.org/disco/soap/" />
3.将WorkflowRemind.wsdl中的
<soap:address location="http://moss/_layouts/WorkflowRemind.asmx" />和
[align=left] <soap12:address location="http://moss/_layouts/WorkflowRemind.asmx" /> [/align]
替换为:
<soap:address location=<% SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(SPWeb.OriginalBaseUrl(Request)),Response.Output); %> />
和
[align=left] <soap12:address location=<%SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(SPWeb.OriginalBaseUrl(Request)),Response.Output); %> />[/align]
[align=left] 对于contractRef 还有soap address这两个节的更改,实际上是在页面里面重新编码了soap的查询url,这样做的目的也是为了moss托管的web service可以在运行时根据动态的请求来正确定位。[/align]
[align=left] 4.将WorkflowRemind.disco和WorkflowRemind.wsdl改名为WorkflowReminddisco.aspx和WorkflowRemindwsdl.aspx[/align]
[align=left]四:部署webservice[/align]
[align=left]将WorkflowReminddisco.aspx,WorkflowRemindwsdl.aspx 和WorkflowRemind.asmx三个文件拷贝到c:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\ISAPI目录中,然后我们就可以通过以下地址来检测我们部署是否成功了。http://moss/_vti_bin/WorkflowRemind.asmx. [/align]
[align=left]如下图所示:[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
[align=left]五:客户端调用[/align]
[align=left]新建一个winform项目,添加一个web引用,地址为:http://moss/_vti_bin/WorkflowRemind.asmx,[/align]
[align=left]为窗体编写代码如下:[/align]
Code
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
namespace WindowsForms
{
publicpartialclass Form1 : Form
{
public Form1()
{
InitializeComponent();
}
privatevoid Form1_Load(object sender, EventArgs e)
{
string UserName = "gaoyan";
string Password = "111111";
string Domain ="gsmn.com";
string SiteUrl = "http://moss";
moss.WorkflowRemind remind = new moss.WorkflowRemind();
remind.Credentials = new NetworkCredential(UserName, Password, Domain);
int wfCount = remind.getWorkflowApproveCount(UserName,Password, Domain, SiteUrl);
label2.Text = wfCount.ToString();
}
}
}
[align=left]效果如下图所示:[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]至此,整个过程已经完成。[/align]
具体的实现过程如下:
一:建立Webservice项目
1.使用vs2008建立一个webserivce项目来实现我们的webservice,如下图所示:
为workflowRemind.asmx编写代码如下:
Code
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Xml.Linq;
using Microsoft.SharePoint;
namespace MossWS
{
/// <summary>
/// WorkflowRemind 的摘要说明
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ToolboxItem(false)]
// 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。
// [System.Web.Script.Services.ScriptService]
public class WorkflowRemind : System.Web.Services.WebService
{
[WebMethod]
public string HelloWorld()
{
return "Hello World";
}
public SPUser GetSPUser(string UserName, string Domain, string SiteUrl)
{
SPUser user = null;
using (SPSite siteColl = new SPSite(SiteUrl))
{
Domain = Context.User.Identity.Name.Split('\\')[0];
user = siteColl.RootWeb.AllUsers[Domain + "\\" + UserName];
}
return user;
}
[WebMethod]
public int getWorkflowApproveCount(string UserName, string Password, string Domain, string SiteUrl)
{
SPUser user = GetSPUser(UserName, Domain, SiteUrl);
int returnCount = 0;
using (SPSite siteColl = new SPSite(SiteUrl))
{
SPWeb web = siteColl.OpenWeb("/workflowmodule");
string query = "<Where>"
+ " <And>"
+ " <Eq>"
+ " <FieldRef Name=\"_x5f53__x524d__x5ba1__x6279__x4e\" LookupId=\"TRUE\"/>"
+ " <Value Type=\"User\">" + user.ID + "</Value>"
+ " </Eq>"
+ " <Eq>"
+ " <FieldRef Name=\"_x72b6__x6001_\" />"
+ " <Value Type=\"Choice\">未启动</Value>"
+ " </Eq>"
+ " </And>"
+ " </Where>";
SPQuery spq = new SPQuery();
spq.Query = query;
SPListItemCollection items = web.Lists["workflowRecord"].GetItems(spq);
returnCount = items.Count;
}
return returnCount;
}
}
}
二.生成.wsdl,.disco文件
(1).copy webservice生成的bin到要部署的sharepoint 网站的虚拟目录bin下
(2).打开layouts目录(layouts地址C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\LAYOUTS),拷贝webservice下的.asmx文件到layouts下
(3).开始--运行,输入cmd,转向layouts目录,运行
[align=left] disco http://服务器:端口号/_layouts/WorkflowRemind.asmx[/align] [align=left]注:若没有disco.exe文件,则需要安装microsoft sdks,打开C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin,拷贝disco.exe到layouts目录下,运行disco http://服务器:端口号/_layouts/WorkflowRemind.asmx。[/align] [align=left]完成后会生成webservice文件WorkflowRemind.disco和WorkflowRemind.wsdl文件。[/align]
三、修改.wsdl,.disco文件
1.将WorkflowRemind.disco和WorkflowRemind.wsdl文件中的<?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"; %>
[align=left] 实际上就是把原来的纯xml变换成为一个page来解析。并且这个页面的解析是通过moss处理的。 [/align]
[align=left] 2.将WorkflowRemind.disco中的[/align]
<contractRef ref="http://moss/_layouts/WorkflowRemind.asmx?wsdl" docRef="http://moss/_layouts/WorkflowRemind.asmx" xmlns="http://schemas.xmlsoap.org/disco/scl/" />
<soap address="http://moss/_layouts/WorkflowRemind.asmx" xmlns:q1="http://tempuri.org/" binding="q1:WorkflowRemindSoap" xmlns="http://schemas.xmlsoap.org/disco/soap/" />
<soap address="http://moss/_layouts/WorkflowRemind.asmx" xmlns:q2="http://tempuri.org/" binding="q2:WorkflowRemindSoap12" xmlns="http://schemas.xmlsoap.org/disco/soap/" />
[align=left] 替换为:[/align]
<contractRef ref=<% SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(SPWeb.OriginalBaseUrl(Request) + "?wsdl"),Response.Output); %> docRef=<% SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(SPWeb.OriginalBaseUrl(Request)), Response.Output); %> xmlns="http://schemas.xmlsoap.org/disco/scl/" />
<soap address=<% SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(SPWeb.OriginalBaseUrl(Request)),Response.Output); %> xmlns:q1="http://tempuri.org/" binding="q1:HelloWorld" xmlns="http://schemas.xmlsoap.org/disco/soap/" />
<soap address=<% SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(SPWeb.OriginalBaseUrl(Request)),Response.Output); %> xmlns:q2="http://tempuri.org/" binding="q2:ServiceSoap12" xmlns="http://schemas.xmlsoap.org/disco/soap/" />
3.将WorkflowRemind.wsdl中的
<soap:address location="http://moss/_layouts/WorkflowRemind.asmx" />和
[align=left] <soap12:address location="http://moss/_layouts/WorkflowRemind.asmx" /> [/align]
替换为:
<soap:address location=<% SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(SPWeb.OriginalBaseUrl(Request)),Response.Output); %> />
和
[align=left] <soap12:address location=<%SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(SPWeb.OriginalBaseUrl(Request)),Response.Output); %> />[/align]
[align=left] 对于contractRef 还有soap address这两个节的更改,实际上是在页面里面重新编码了soap的查询url,这样做的目的也是为了moss托管的web service可以在运行时根据动态的请求来正确定位。[/align]
[align=left] 4.将WorkflowRemind.disco和WorkflowRemind.wsdl改名为WorkflowReminddisco.aspx和WorkflowRemindwsdl.aspx[/align]
[align=left]四:部署webservice[/align]
[align=left]将WorkflowReminddisco.aspx,WorkflowRemindwsdl.aspx 和WorkflowRemind.asmx三个文件拷贝到c:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\ISAPI目录中,然后我们就可以通过以下地址来检测我们部署是否成功了。http://moss/_vti_bin/WorkflowRemind.asmx. [/align]
[align=left]如下图所示:[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
[align=left]五:客户端调用[/align]
[align=left]新建一个winform项目,添加一个web引用,地址为:http://moss/_vti_bin/WorkflowRemind.asmx,[/align]
[align=left]为窗体编写代码如下:[/align]
Code
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
namespace WindowsForms
{
publicpartialclass Form1 : Form
{
public Form1()
{
InitializeComponent();
}
privatevoid Form1_Load(object sender, EventArgs e)
{
string UserName = "gaoyan";
string Password = "111111";
string Domain ="gsmn.com";
string SiteUrl = "http://moss";
moss.WorkflowRemind remind = new moss.WorkflowRemind();
remind.Credentials = new NetworkCredential(UserName, Password, Domain);
int wfCount = remind.getWorkflowApproveCount(UserName,Password, Domain, SiteUrl);
label2.Text = wfCount.ToString();
}
}
}
[align=left]效果如下图所示:[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]至此,整个过程已经完成。[/align]
相关文章推荐
- MOSS中使用自定义WebService
- MOSS中如何自定义WebService
- MOSS中如何自定义WebService
- MOSS2010中如何使用自定义WebService
- MOSS中自定义WebService
- MOSS中自定义WebService与客户端应用
- MOSS中如何自定义WebService
- MOSS中如何自定义WebService
- moss自定义登陆页面
- [转]MOSS 2007 最简单的自定义搜索框 SearchBox
- WebService中使用自定义类进行传输的一些方法
- .net与java 使用自定义对象通过WebService调用
- 在MOSS 2007中自定义DataView Webpart的数据显示样式
- SharePoint : 为WSS或者MOSS编写自定义的Web Service
- webservice如何传递复杂参数和自定义参数
- WebService创建自定义类作为webmethod的参数!
- Moss/Sharepoint:自定义 Oracle Membership
- Eclipse居于Axis2开发WebService(使用自定义对象)及生成客户端代码
- webservice服务输出xml格式自定义格式内容
- 【WebService】CXF拦截器的设置以及自定义CXF拦截器