有留言讲这是一个把MOSS当作后台的方案,基本上这样讲没有错,严格上应该是一个没有用sharepoint webpart的方案。
至于不如直接用asp.net+ado.net讲法。对牛人们来讲,大概是这样。不过对做工程的人而言,能不能多快好省,不从零开始才是第一等大事。
第十二周
用户有这样一个需求:当前公司有相当数量的基于web的应用(Web Application),或多或少均有一些工作流程(Workflow process),目前只能用email通知用户,相当不便,管理层希望在门户网站上,可以让用户知道当前有多少待决事项(Pending Task).同时又要求不对其他的web的应用有重大修改,也没有什么特别的预算。
关于这些web的应用的基本情况如下
操作系统OS: Windows 2000, Windows 2003, Linux 和 Sun OS
平台platform:J2EE(Weblogic), ASP, ASP.NET 1.1, ASP.NET 2.0, Lotus Notes/Domino
编程语言Language: Java, ASP, C#, VB.NET, PHP, JSP, Domino
数据库Database: MSSQL2000, MSSQL2003, Oracle, MySQL, LotusNotes
权限控制Access Control: AD, LotusNotes 和application 本身的权限控制模块
这个子模块被命名为提示模块(Alert Module)
在仔细的和每个application team谈话后,发现对象千差万别。只有二点共同之处
- 都是用Web,也就是说用HTTP
- 都是用NT账号来管理用户权限
方案一
提示模块每次分别访问Web应用的数据库取得待决事项数据
==〉被否决
原因:工程浩大,旷日持久,LotusNotes无法访问。而且,把手伸进其他的Web应用项目也是违反本项目组的开发原则。
方案二
在使用最多的数据库MSSQL2000/2005上建立一个表(Table),每个Web应用把待决事项写入
==〉被否决
原因:和方案一一样,不同的是要求其他的Web应用项目来完成。有些项目完成已久,小修小补可以,不可能大动干戈。
方案三
要求每个Web应用组为待决事项建立一个web service.
==〉非常时髦,但是还是被否决
原因:大部分Web应用组回答,可以为门户网站(portal),新增几个HTML page可以,Web Service免谈。
少部分Web应用组回答:什么忙也不能帮。
领导并且要求portal设立一个简单通用跨平台的标准(Alert Standard),让以后的Web应用遵守
最后的解决方案
在MOSS2007建立一个列表(Alert),主要有下列Fields
URL:String
DEMOXML:String
XSL:String
AlertName:String
要求每个Web应用组提供一个网址URL,(例如:http://webserver/application/alert.aspx?user=)
这个网址必须返回一个XML文件,例如
<alert>
<Claim>
<UserID>xxxx</UserID>
<Counter>nnn</Counter>
<URL>http://werbserver/application/pending.aspx</URL>
<Description>ssssssssssssss</Description>
</Claim>
</alert>
其中的UserID和Description是供检查之用。
URL是Web应用告知的待决事项(Pending task)网址。
Counter当然是该用户当前的在这个Web应用的待决事项数目。
Alert Module会根据Alert List逐个访问Web Application,并且传送userid 例如:http://webserver/application/alert.aspx?user=by1455)。
Alert Module并且要求每个url是匿名方式,因为服务器对服务器的访问在NTML方式下无法传递NT账号信息。
在取得Web应用传回的xml文件后,再与存放在XSL(field)中的xsl模板进行变换(transform),然后,逐一
显示在portal上(0 事件不显示)
以下是部分代码(第十二周版本)
Dim myUserID As String = Mylib.getUserID(Request.ServerVariables("AUTH_USER").ToString())
Dim Debug As String = Request.QueryString("debug")
Dim stagingdata As String = ""
Try
' SiteID = "Alert"
SiteID = checkInput("SiteID")
Myserver = "http://" + Request.ServerVariables("HTTP_HOST").ToString()
Mylib.getSiteInfo(Myserver, SiteID, MySite, myCSS, myImages, MyXSLLIB)
MyURL = Request.Url.ToString()
myUrlwithEncode = Server.UrlEncode(MyURL)
Catch ex As Exception
'Response.Write(ex.ToString)
'Response.End()
End Try
Dim MyListName As String = "Alert"
Dim MyViewName As String = "Visible"
Dim MyMode As String = checkInput("mode")
Dim MyID As String = Request.QueryString("ID")
If MyID = Nothing Then
MyID = ""
End If
Dim MyList As SPList
Dim myView As SPView = Nothing
Dim MyListItems As SPListItemCollection = Nothing
Dim XMLBuffer As String = ""
Dim ds As New DataSet
Dim Dt As DataTable = Nothing
Dim doc As XmlDocument = New XmlDocument
MyList = Mylib.getList(Myserver, MySite, MyListName, err)
CheckError(err)
myView = MyList.Views(MyViewName)
MyListItems = MyList.GetItems(myView)
If MyListItems.Count = 0 Then
Response.Write("Empty List")
Response.End()
End If
Dt = MyListItems.GetDataTable()
ds.DataSetName = "List"
Dt.TableName = "View"
ds.Tables.Add(Dt)
If UCase(MyMode) = "XML" Then
XMLBuffer = "<?xml version=""1.0"" encoding=""utf-8"" ?>" + vbCrLf
XMLBuffer = XMLBuffer + "<!-- List is '" + MyListName + "' ,View is '" + MyViewName + "'-->" + vbCrLf
XMLBuffer = XMLBuffer + ds.GetXml
doc.LoadXml(XMLBuffer)
AlertXML.Document = doc
Else
Dim CSSLocation As String = Myserver + MySite + myCSS
Dim XMLData As String = ""
Dim myAlertName As String = Request.QueryString("Alert")
Dim Row As DataRow
Dim buffer As String = ""
AlertInfo = AlertInfo + addAlertInfo("Summary", " Done by")
Dim ErrorMessage As String = ""
For Each Row In Dt.Rows
Dim AlertName As String = Row.Item("LinkTitle")
AlertInfo = AlertInfo + addAlertInfo(AlertName, "Begin Time")
ErrorMessage = ""
If (myAlertName = "") Or (UCase(myAlertName) = UCase(AlertName)) Then
If UCase(MyMode) = "TEST" Then
XMLData = Row.Item("TestXML")
Else
XMLData = GetXMLfromURL(Row.Item("AlertURL"), myUserID, ErrorMessage)
If ErrorMessage <> "" Then
AlertInfo = AlertInfo + addAlertInfo(AlertName, "[Error get XML ]")
Else
XMLData = XMLData.TrimStart(Nothing)
End If
End If
If ErrorMessage = "" Then
buffer = buffer + cutQuizMark(Mylib.transformXMLwithXSL(XMLData, Row.Item("XSLT")))
If ErrorMessage <> "" Then
AlertInfo = AlertInfo + addAlertInfo(AlertName, "[Error create HTML]")
Else
AlertInfo = AlertInfo + addAlertInfo(AlertName, "End Time ")
End If
Else
AlertInfo = AlertInfo + addAlertInfo(AlertName, ErrorMessage)
AlertInfo = AlertInfo + addAlertInfo(AlertName, Row.Item("AlertURL"))
End If
End If
Next
If Trim(buffer).Length = 0 Then
buffer = "<html><head><link rel=""stylesheet"" type=""text/css"" href=""{0}""></head><body topmargin=""0"" leftmargin=""0"" marginwidth=""0"" marginheight=""0"" bottommargin=""0""></body></html>"
Else
Dim tmpbuffer As String = buffer
buffer = "<div class=""personalize"">"
buffer = buffer + "<h3><strong>Alert</strong></h3>" + vbCrLf
buffer = buffer + tmpbuffer + "</div>"
End If
buffer = String.Format(buffer, CSSLocation, Myserver + MySite + myImages, myCSS)
Response.Write(buffer)
If Not (Debug Is Nothing) Then
Response.Write("<table border=1>")
Response.Write(AlertInfo)
Response.Write("</table>")
End If
Response.End()
End If
alert module还有很多改进的余地,但是,至少提供了一个简单的方式与现有的未来的web application在待决事项上
通讯界面。并且保持了和viewlist.aspx一样的参数设置,并没有增加项目的复杂度。
因为使用匿名方式,每个人都可以有办法看到其他人的待决事项数,包括CEO的。但是,SO WHAT !