• 将WebService部署到 SharePoint 2010 gac 缓存中,并用Log4Net记录日志到数据库


    最近做了一个sharePoint项目,需要实现的功能是,第三方网站访问我们sharePoint中的数据,通过Webservice方式实现文件的上传和下载。

    于是代码工作完成了之后,本地调试没什么问题,部署到服务器上各种问题。

    部署到SharePoint的gac缓存中,步骤挺麻烦的,比较容易出错,一定要仔细完成。

    注:WebService可以已网站形式发布,但如果用做SharePoint的话还是部署到SharePoint的gac缓存中好

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

    1. ​找到项目中的bindebug文件夹,复制dll到新建的文件夹中,比如:C:siteIdeal.UploadDocuments.dll

    2. ​打开命令工具,以管理员身份运行,并转到目录C:Program Files (x86)Microsoft SDKsWindowsv7.0ABin 下

    3. ​输入命令gacutil - if path,其中path为1中的路径,例如:gacutil - if  C:siteIdeal.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:Windowsassembly右击dll文件的属性查看到,YourClass即为开发Web Service的类名。

    2)将Web Service的 *.asmx 文件复制到 C:ProgramFilesCommon FilesMicrosoft Sharedweb server extensions14TEMPLATELAYOUTS 中,使用disco.exe(C:Program Files (x86)Microsoft SDKsWindowsv7.0ABin文件夹下)工具去发现这个Web Service,以生成 .disco 和 .wsdl 文件,生成的文件也在C:Program Files (x86)Microsoft SDKsWindowsv7.0ABin文件夹下,运行如下命令生成:

    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:ProgramFilesCommon FilesMicrosoft Sharedweb server extensions14ISAPI文件夹下,然后就可以直接调用了,调用地址如下: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记录日志到数据库已完成。有么有更好的方法,欢迎留言交流,谢谢!

  • 相关阅读:
    linux内核——进程切换宏switch_to
    android源码目录结构详解
    SRM 390(1-250pt)
    SRM 391(1-250pt)
    CodeForces 221(div 2)
    SRM 407(1-250pt, 1-500pt)
    SRM 392(1-250pt)
    SRM 393(1-250pt)
    CodeForces 220(div 2)
    SRM 406(1-250pt, 1-500pt)
  • 原文地址:https://www.cnblogs.com/wuzhsh/p/SharePoint_webservice.html
Copyright © 2020-2023  润新知