在Web服务中使用列表

时间:2012-01-30 16:40:05

标签: c# .net list exception asmx

我正在制作网络服务(由于.net req而无法转移到wcf)。我的WebServiceRequest类包含其他类的列表。当我尝试编译代码时,我得到以下错误:

request.List = list;
  

无法隐式转换类型   'System.Collections.Generic.List'到   'ServiceReference1.foo []'

当我request.List = list.ToArray();时,此错误消失了 但是当我运行代码时,我得到了这个例外:

  

接收HTTP响应时发生错误   http://localhost:60380/fooService/fooService.asmx。这可能是应该的   不使用HTTP协议的服务端点绑定。这个   也可能是由于HTTP请求上下文被中止   服务器(可能是由于服务关闭)。查看服务器日志   了解更多详情。

内部例外:

  

基础连接已关闭:发生意外错误   收到。

服务器堆栈跟踪:

  

在   System.ServiceModel.Channels.HttpChannelUtilities.ProcessGetResponseWebException(引发WebException   webException,HttpWebRequest请求,HttpAbortReason abortReason)
  在   System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(时间跨度   超时)at   System.ServiceModel.Channels.RequestChannel.Request(消息消息,   TimeSpan超时)at   System.ServiceModel.Dispatcher.RequestChannelBinder.Request(消息   消息,TimeSpan超时)at   System.ServiceModel.Channels.ServiceChannel.Call(String action,   Boolean oneway,ProxyOperationRuntime操作,Object [] ins,   对象[]出局,TimeSpan超时)at   System.ServiceModel.Channels.ServiceChannel.Call(String action,   Boolean oneway,ProxyOperationRuntime操作,Object [] ins,   对象[]出局)   System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage   methodCall,ProxyOperationRuntime operation)at   System.ServiceModel.Channels.ServiceChannelProxy.Invoke(即时聊天   消息)

     

在[0]处重新抛出异常:at   System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(即时聊天   reqMsg,IMessage retMsg)at   System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData&安培;   msgData,Int32类型)at   ServiceReference1.testpingtestSoap.Calculatetestping(CalculatetestpingRequest1   请求)   ServiceReference1.testpingtestSoapClient.ServiceReference1.testpingtestSoap.Calculatetestping(CalculatetestpingRequest1   请求)在c:\ Users \ User \ AppData \ Local \ Temp \ Temporary ASP.NET中   Files \ test \ 2e05987f \ 91110734 \ App_WebReferences.rwmro5zd.0.cs:第855行   在   ServiceReference1.testpingtestSoapClient.Calculatetestping(CalculatetestpingRequest   _request)在c:\ Users \ User \ AppData \ Local \ Temp \ Temporary ASP.NET Files \ test \ 2e05987f \ 91110734 \ App_WebReferences.rwmro5zd.0.cs:line 862   在testCost2.Calculatetestping()中   C:\用户\用户\桌面\测试\ InfoSystem \ testping \ testCost2.aspx.cs:线   203在testCost2.Submit_Go(Object sender,EventArgs e)中   C:\用户\用户\桌面\测试\ InfoSystem \ testping \ testCost2.aspx.cs:线   148在System.Web.UI.WebControls.Button.OnClick(EventArgs e)at   System.Web.UI.WebControls.Button.RaisePostBackEvent(字符串   eventArgument)at   System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(字符串   eventArgument)at   System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler   sourceControl,String eventArgument)at   System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData)
  在System.Web.UI.Page.ProcessRequestMain(布尔值   includeStagesBeforeAsyncPoint,Boolean includeStagesAfterAsyncPoint)

编辑1: 要求&响应Web服务的类

 public class Item
    {

        public List<string> Composites { get; set; }
        public string Composites_List { get { return string.Join(", ", Composites.ToArray()); } }



        public List<px> pxes { get; set; }
        public List<ox> oxes { get; set; }

        public List<MethodCalculationType> MethodCalculationTypes { get; set; }
        public ShippingItem() { }
        public void ShippingItemFill(string sku, int quantity)
        {
            \\this method is just written to avoid parameterless constructor error
        }
        public static ItemComparison = delegateItem item1, Item item2) { return item1.Area.CompareTo(item2.Area); };
    }
   public class Request
    {
        public List<Item> ItemList;
        public bool showAllRatesField;
        public bool m_Ignore;
        public string pTextField;
        public decimal TotalField;

            }
    public class Responce
    {
        public od [] ods;

    }

2 个答案:

答案 0 :(得分:0)

发现问题,您可以根据需要在参数中使用尽可能多的Lists<> webservice,这是我发现的;如果有人需要它:

1.通过在服务器端向web.config添加以下内容,在服务器上启用了dignostics  

  
    

<system.diagnostics> <trace autoflush="true" /> <sources> <source name="System.Web.Services.Asmx"> <listeners> <add name="AsmxTraceFile" type="System.Diagnostics.TextWriterTraceListener" initializeData="local.log" traceOutputOptions="LogicalOperationStack, DateTime, Timestamp, ProcessId, ThreadId" /> </listeners> </source> </sources> <switches> <add name="System.Web.Services.Asmx" value="Verbose" /> </switches> </system.diagnostics>

  


 2.当发生Http异常时;在日志文件中,它写了error reading or writing a variable我在webservice代码中查找了该变量,该变量为internal,从该变量中删除了内部关键字,代码开始工作。

结果soap需要参数化序列化,因此自定义参数类中的任何变量都应该是公共读/写。正如John Saunders所提到的那样here

答案 1 :(得分:-2)

首先使用.asmx,我忘记了你不能返回一个列表,你必须返回一个数组,所以它期待一个数组

至于第二个例外,您的服务未正确配置/设置。如果您想要修复,则需要发布更多代码。

顺便提一下服务器事件日志。 有时这可能会有所帮助。 开始菜单 - &gt;管理工具 - &gt;事件查看器。查看应用程序日志。