文章出處

最近做了一個sharePoint項目,需要實現的功能是,第三方網站訪問我們sharePoint中的數據,通過Webservice方式實現文件的上傳和下載。

于是代碼工作完成了之后,本地調試沒什么問題,部署到服務器上各種問題。

部署到SharePoint的gac緩存中,步驟挺麻煩的,比較容易出錯,一定要仔細完成。

注:WebService可以已網站形式發布,但如果用做SharePoint的話還是部署到SharePoint的gac緩存中好

 

第一步:部署dll到gac緩存中

  1. ​找到項目中的bin\debug文件夾,復制dll到新建的文件夾中,比如:C:\site\Ideal.UploadDocuments.dll

  2. ​打開命令工具,以管理員身份運行,并轉到目錄C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\ 下

  3. ​輸入命令gacutil - if path,其中path為1中的路徑,例如:gacutil - if  C:\site\Ideal.UploadDocuments.dll

  4. ​回車確認,這樣就將dll部署到了gac緩存中了

  5. 查看dll部署成功與否,可以使用命令:gacutil -u Ideal.UploadDocuments

    卸載dll,可以使用命令:gacutil -l Ideal.UploadDocuments

    如圖:

     

  6. 用同樣的方法,部署log4net.dll到gac緩存中
  7. 部署好dll后還要生成wdsl文件等,這幾步會比較麻煩

 

第二步:部署服務到SharePoint中

 

1)將Web Service的 *.asmx 文件用記事本打開,將其中的代碼

<%@ WebServiceLanguage="C#"CodeBehind="ClassName.asmx.cs"Class="YourNameSpace.YourClass"%>

改為如下代碼

<%@ WebServiceLanguage="C#"Class="YourNameSpace.YourClass,YourNameSpace,Version=YourVersion,Culture=neutral,PublicKeyToken=YourPublicKeyToken"%>

其中YourNameSpace,YourVersion,YourPublicKeyToken可以通過在C:\Windows\assembly\右擊dll文件的屬性查看到,YourClass即為開發Web Service的類名。

2)將Web Service的 *.asmx 文件復制到 C:\ProgramFiles\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\LAYOUTS 中,使用disco.exe(C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\文件夾下)工具去發現這個Web Service,以生成 .disco 和 .wsdl 文件,生成的文件也在C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\文件夾下,運行如下命令生成:

disco http://MyServerName/_layouts/WebServiceName.asmx

3)打開 .disco 和 .wsdl 文件,并將頭部XML聲明代碼 (<?xml version="1.0" encoding="utf-8"?>) 替換為下列代碼:

1
<%@ PageLanguage="C#"Inherits="System.Web.UI.Page"%><%@ AssemblyName="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"%><%@ ImportNamespace="Microsoft.SharePoint.Utilities"%><%@ ImportNamespace="Microsoft.SharePoint"%><% Response.ContentType= "text/xml"; %>

​4)將.disco 文件中discovery節點中的代碼替換如下:

<discovery xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/disco/"> 

<contractRefref=<%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/" /> 

<soapaddress=<%SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(SPWeb.OriginalBaseUrl(Request)),Response.Output); %>xmlns:q1="http://tempuri.org/" binding="q1:UploadDocSoap " xmlns="http://schemas.xmlsoap.org/disco/soap/" /> 

<soapaddress=<%SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(SPWeb.OriginalBaseUrl(Request)),Response.Output); %>xmlns:q2="http://tempuri.org/" binding="q2:UploadDocSoap12 " xmlns="http://schemas.xmlsoap.org/disco/soap/" /> 

</discovery>

 

并將上面的UploadDoc 替換成你的webservice的類名。

5)將.wsdl 文件中指定的 SOAP 地址替換如下:

<soap:addresslocation=<%SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(SPWeb.OriginalBaseUrl(Request)),Response.Output); %>/><soap12:addresslocation=<%SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(SPWeb.OriginalBaseUrl(Request)),Response.Output); %>/>

6)將*.disco 和*.wsdl文件分別重命名為*disco.aspx 和*wsdl.aspx;

7)將*.asmx ,*disco.aspx 和*wsdl.aspx這三個文件一起復制到C:\ProgramFiles\Common Files\Microsoft Shared\web server extensions\14\ISAPI\文件夾下,然后就可以直接調用了,調用地址如下:http://MyServerName/_vti_bin/*.asmx

       如圖:

 

第三步:將log4Net加入到webservice中

 

由于這種方式是部署到gac緩存中的,并不能像部署網站那樣有自己的web.config,bin文件夾,已經global.asax等

因此如果使用Log4Net記錄日志的話和普通的使用方法有點出入。

 

部署到gac緩存中,就相當于將webservice部署到了SharePoint中了,那么它將會讀取SharePoint網站中的webconfig,因此只要將相關配置移植到SharePoint網站下的webconfig中即可。

webconfig 路徑如何找到呢?打開iis,找到SharePoint網站,右鍵選擇【瀏覽】,在打開的目錄中即可找到webconfig

 

1 復制如下定義到相應節點

<configuration>   

  <configSections>   

    <!-- log4net的定義 -->   

    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />   

  </configSections>   

</configuration>

 

2 將log4Net的配置放入到configuration 中,關于配置說明這里就不細說了,主要是配置日志記錄到sql server中和log文件中

 

<log4net  debug="true">    

    <!-- Define some output appenders -->    

    <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">    

      <layout type="log4net.Layout.PatternLayout" >    

        <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n"/>    

      </layout>    

    </appender>    

    <appender name="SqlServerLogAppender" type="log4net.Appender.AdoNetAppender">    

      <!--緩沖區大小,指緩沖到幾條日志后才一次性寫入數據庫-->    

      <bufferSize value="1"/>    

      <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />    

      <connectionString value="Data Source=localhost;Initial Catalog=WebServiceLog;Integrated Security=True;MultipleActiveResultSets=True" />    

      <commandText value="INSERT INTO T_SYSTEM_LOG (LOG_DATE,LOG_LEVEL,LOG_INFO) VALUES (@LOG_DATE,@LOG_LEVEL,@LOG_INFO)" />    

      <parameter>    

        <parameterName value="@LOG_DATE" />    

        <dbType value="DateTime" />    

        <layout type="log4net.Layout.RawTimeStampLayout" />    

      </parameter>    

      <parameter>    

        <parameterName value="@LOG_LEVEL" />    

        <dbType value="String" />    

        <size value="10" />    

        <layout type="log4net.Layout.PatternLayout">    

          <conversionPattern value="%level" />    

        </layout>    

      </parameter>    

      <parameter>    

        <parameterName value="@LOG_INFO" />    

        <dbType value="String" />    

        <size value="200" />    

        <layout type="log4net.Layout.PatternLayout">    

          <conversionPattern value="%message" />    

        </layout>    

      </parameter>    

    </appender>    

    <appender name="RunTimeLogAppender" type="log4net.Appender.RollingFileAppender">    

      <param name="File" value="logs\\RunTime\\" />    

      <param name="AppendToFile" value="true" />    

      <param name="StaticLogFileName" value="false"/>    

      <param name="DatePattern" value="yyyyMMdd".log""/>    

      <param name="RollingStyle" value="Date"/>    

      <layout type="log4net.Layout.PatternLayout">    

        <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n"/>    

      </layout>    

    </appender>    

    <!-- Setup the root category, add the appenders and set the default level -->    

    <root>    

      <level value="All" />    

    </root>    

    <logger name="UserLog" additivity="false">    

      <level value="Info" />    

      <appender-ref ref="SqlServerLogAppender" />    

    </logger>    

    <logger name="RunTime" additivity="false">    

      <level value="All" />    

      <appender-ref ref="RunTimeLogAppender" />    

    </logger>    

  </log4net>

 

3.如果之前你是將log4net初始化放到了global.asax ,那么請刪除它,將下面語句加入到Assembleyinfo文件中

[assembly: log4net.Config.XmlConfigurator()]

4.重新編譯webservice,并按照第一步步驟重新將dll更新到gac緩存中。

5.重啟IIS,使用命令:iisreset  即可

 

第四步:驗證log4net是否成功寫入數據庫或者log文件中

 

例如在下載文件的服務里記錄了日志,下載個文件試試:

查看sqlserver 中的表,如下:

如果程序出錯,按照log4net的配置會記錄到log日志文件中,查看SharePoint網站下的目錄發現多了個logs文件夾

打開log文件,日志成功記錄

 

至此將WebService部署到 SharePoint 2010 gac 緩存中,并用Log4Net記錄日志到數據庫已完成。有么有更好的方法,歡迎留言交流,謝謝!


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()