欢迎您来到 数字平台。 您尚未登录。[登录] [注册新用户]
当前位置: 论坛首页 / 栏目 产品与服务 / 文章 394

点击:13512[回复顶层] [树状] [详细]
[回复留言] [回复(需要先登录)] [引用(需要先登录)]普通文章第 1 楼
文章id: 393
求助:在WEB页下载挂接资源的程序问题

作者: liujp


编一简单页面,基于web调用libraryws.asmx来实现数据库的查询和挂接资源的下载.程序在2008.08.01以前的版本查询和下载均正确,2008.11.20又升级了libraryws.asmx后,对挂接资源下载是报错

实例验证错误:“OtherError”不是 ErrorCode 的有效值。

说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息: System.InvalidOperationException: 实例验证错误:“OtherError”不是 ErrorCode 的有效值。

源错误:

行 3444:        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://dp2003.com/dp2libraryws/library.asmx/GetRes", RequestNamespace="http://dp2003.com/dp2libraryws/library.asmx", ResponseNamespace="http://dp2003.com/dp2libraryws/library.asmx", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
行 3445:        public Result GetRes(string strResPath, int nStart, int nLength, string strStyle, [System.Xml.Serialization.XmlElementAttribute(DataType="base64Binary")] out byte[] baContent, out string strMetadata, out string strOutputResPath, [System.Xml.Serialization.XmlElementAttribute(DataType="base64Binary")] out byte[] baOutputTimestamp) {
行 3446:            object[] results = this.Invoke("GetRes", new object[] {
行 3447:                        strResPath,
行 3448:                        nStart,

在vs2005中调试代码在执行到最后一次读二进制时报错,在以文代码中标记:

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Net;

using DigitalPlatform;
using DigitalPlatform.CirculationClient;
using DigitalPlatform.Xml;
using DigitalPlatform.LibraryServer;

using System.Xml;
public partial class down : System.Web.UI.Page
{
    CookieContainer Cookies = new System.Net.CookieContainer();
    wsLibrary.Library lib = new wsLibrary.Library();
    wsLibrary.Result result = new wsLibrary.Result();
   
    protected void Page_Load(object sender, EventArgs e)
    {
        //eg.:郭沫若研究/8/object/0
        string strResPath = Request.QueryString["path"];
        //init lib\
        //eg. http://210.41.165.4/dp2libraryws/library.asmx
        lib.Url = (string)Session["SERVERURL"];
        lib.CookieContainer = (CookieContainer)Session["LOGIN"];
        string strError = "";
        int nStart = 0;
        int nLength = 10000000;

        string strStyle = "content,data,metadata,timestamp,outputpath";// data/metadata/timestamp/outputpath之一
        byte[] baContent;
        string strMetaData;
        string strOutputResPath;
        byte[] baOutputTimestamp;

        XmlDocument doc = new XmlDocument();
        result = lib.GetRes(strResPath,
            nStart,
            nLength,
            strStyle,
            out baContent,
            out strMetaData,
            out strOutputResPath,
            out baOutputTimestamp);
        if (result.Value < 0)
        {
            strError = result.ErrorInfo;
            return;
        }
        doc.LoadXml(strMetaData);
        string strLocalPath = doc.FirstChild.Attributes["localpath"].Value;

        string strHeader = "attachment;filename=" + Server.UrlEncode(System.IO.Path.GetFileName(strLocalPath));
       
        Response.Clear();
        Response.ClearContent();       
        Response.ContentType = doc.FirstChild.Attributes["mimetype"].Value;
        Response.AppendHeader("Content-Disposition", strHeader);
       
        while (nStart <= result.Value)
        {
            Response.BinaryWrite(baContent);
            nStart += baContent.Length;

            // 代码在此运行到最后异常

            result = lib.GetRes(strResPath,
            nStart,
            nLength,
            strStyle,
            out baContent,
            out strMetaData,
            out strOutputResPath,
            out baOutputTimestamp);
        }
        Response.Flush();
        Response.Close();
        //Response.End();
    }
}


 



发表时间: 2009-01-14 10:59:11



[回复留言] [回复(需要先登录)] [引用(需要先登录)]普通文章第 2 楼
文章id: 394
回复:求助:在WEB页下载挂接资源的程序问题

作者: xietao


在ASP.NET下开发访问dp2libraryws的程序,有两种方法实现对dp2libraryws Webservice接口的访问。

第一种方法是,像所有Webservice一样,只要你知道它的WSDL文件,你就可以利用.NET的工具来创建一个proxy程序,这个proxy程序把Webservice接口包装了,你看起来就像调用本地函数一样调用它。在这个方法中,WSDL文件包含了所有的机器需要知道的信息,不再需要任何其他东西的支持。Webservice技术牛就牛在这点,它是一个非常通用和简洁的技术。当然,为了完成开发,可能需要针对具体API的解释性文档,让开发者能够了解API的功能,不过这是给人看得,不是给机器看的。

第二种方法是,采用数字平台公司为dp2libraryws webservice API接口开发的DigitalPlatform.CirculationClient.dll库函数,相当于在上述第一种方法的传统的proxy程序代码上又增加了一层和通讯有关的功能,强调了通讯通道的概念,对多通道和并发访问有完善的处理办法(例如采用Stop类和工具条上的停止按钮很好集成,方便操作者随时中断长操作)。这是目前dp2circulation、dp2catalog等前端所采用的接口库。这个库的好处是,它比较成熟,开发者只需要调用里面的一些接口函数,就可以实现访问dp2libraryws服务器的功能,而不必要去了解许多webservice proxy接口的细节。

第二种方法的缺点是,开发者必须了解DigitalPlatform.CirculationClient.dll库函数的特性思维模式,否则用起来会有些困难。其实,DigitalPlatform.CirculationClient.dll库函数仅仅是访问dp2libraryws的一种途径和方法,不是唯一的方法。

在上次的email通讯中,我回复你的最后一封email里面我问你最近采用的是哪种方法,我知道了后可以提供更有针对性地服务和帮助。然后就一直没有得到你的回复。(我这几天没有去公司,没有收最新的email。)

从你这次提供的代码片段看,出现

using DigitalPlatform.CirculationClient;

这一句话,表明你有挂接使用这个函数库的用意;

wsLibrary.Library lib = new wsLibrary.Library();
wsLibrary.Result result = new wsLibrary.Result();

好像又是在调用你自己创建的proxy代码内的东西。

我这里重申一下,两种方法不要混用。

我现在不在公司的开发机器面前,有些代码看不到,我对你描述的情况先进行一些简单分析,其实原因可能是你现在手头的DigitalPlatform.CirculationClient.dll二进制或者源代码旧了,因为几个月过去了,dp2libraryws webservice API发生了不少变化,因而DigitalPlatform.CirculationClient.dll库函数也发生了不少变化,如果你采用了DigitalPlatform.CirculationClient.dll库函数,我回头给你提供最新的库函数版本,问题就会消失。

而如果你采用的是自己的proxy程序,你只需要在VS2005中webservice reference节点那里update刷新一下,重新编译一下代码即可。

如有进一步的问题请继续发帖交流。

在计划中,我们过一段会在网站上提供样例程序的打包下载,在dp2系统的参考手册里也会增加更详细的章节解释。



发表时间: 2009-01-14 22:47:15



页 1 / 1
 

在线用户
(无) 
当前栏目在线用户数 0, 总在线用户数 0