Использование списков в веб-сервисе - PullRequest
1 голос
/ 30 января 2012

Я делаю веб-сервис (не могу перейти на wcf из-за .net req).В моем классе 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, HttpWebRequest запрос, HttpAbortReason abortReason)
estHhannelChannelChannelChannel.WaitForReply (тайм-аут TimeSpan) в System.ServiceModel.Channels.RequestChannel.Request (сообщение-сообщение, тайм-аут TimeSpan) в System.ServiceModel.Dispatcher.RequestChannelBinder.Request (сообщение-сообщение, тайм-аут TimeSpan) в System.ServiceModel.CnelS.Cnelnel.Строковое действие, Boolean oneway, операция ProxyOperationRuntime, Object [] ins, Object [] outs, TimeSpan timeout) в System.ServiceModel.Channels.ServiceChannel.Call (Строковое действие, Boolean oneway, ProxyOperationRuntime, Object [] ins,Object [] outs) в System.ServiceModel.Channels.ServiceChannelProxy.InvokeService (метод IMethodCallMessageCall, операция ProxyOperationRuntime) в System.ServiceModel.Channels.ServiceChannelProxy.Invoke (сообщение IMessage)

* в 1028System.Runtime.Remoting.testpingtestSoapClient.ServiceReference1.testpingtestSoap.Calculatetestping (запрос CalculatetestpingRequest1) в каталоге c: \ Users \ User \ AppData \ Local \ Temp \ Временные файлы ASP.NET \ test \ 2e05987f \ 91110734 \ App_WebReferences.rwmro5zd55.testpingtestSoapClient.Calculatetestping (CalculatetestpingRequest _request) в каталоге c: \ Users \ Пользователь \ AppData \ Local \ Temp \ Временные файлы ASP.NET \ test \ 2e05987f \ 91110734 \ App_WebReferences.rwmro5zd.0.cs: строка 862 в testCost2.Calculatetestping () в c: \ Users \ User \ Desktop \ test \ InfoSystem \ testping \ testCost2.aspx.cs: строка 203 в testCost2.Submit_Go (отправитель объекта, EventArgs e) вc: \ Users \ Пользователь \ рабочий стол \ test \ InfoSystem \ testping \ testCost2.aspx.cs: строка 148 в System.Web.UI.WebControls.Button.OnClick (EventArgs e) в System.Web.UI.WebControls.Button.RaisePostBackEvent (String eventArgument) в System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent (String eventArgument) в System.Web.UI.Page.RaisePostBackEvent (IPostBackEventEvent, EventWackEventHevent, IP-интерфейс.UI.Page.RaisePostBackEvent (NameValueCollection postData)

в System.Web.UI.Page.ProcessRequestMain (логическое значение includeStagesBeforeAsyncPoint, логическое значение includeStagesAfterAsyncPoint)
1032 * Редактировать 1 класс веб-службы запроса1033 *
 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 голосов
/ 31 января 2012

Обнаружив проблему, вы можете использовать столько Lists<> в своих параметрах для веб-сервиса, сколько хотите, вот что я нашел; если кому-то это нужно:

1. Включен dignostics на сервере, добавив ниже в web.config на стороне сервера

<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 я посмотрел эту переменную в коде веб-сервиса, и эта переменная была internal, удалил внутреннее ключевое слово из этой переменной, и код начал работать.

Оказывается, soap необходимо сериализовать параметры, поэтому любые переменные в вашем классе пользовательских параметров должны быть публичными для чтения / записи. как упомянуто Джоном Сондерсом здесь

0 голосов
/ 30 января 2012

Ну, во-первых, с .asmx, и я забыл об этом, вы не можете вернуть список, вы должны вернуть массив, поэтому он ожидает массив

Что касается второго исключения, ваша служба не настроена / настроена неправильно.Вам нужно будет опубликовать больше кода, если вы хотите исправить.

Кстати, в журнал событий сервера входит. Иногда это может быть полезно.Пуск Меню-> Администрирование-> Просмотр событий.Посмотрите в журнале приложений.

...