powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / DotNetGateway и большие строки
16 сообщений из 16, страница 1 из 1
DotNetGateway и большие строки
    #37206887
mys
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
mys
Гость
Есть .NET сборка. Создаем экземпляр класса. Вызываем метод, который возвращает строку. И получаем ошибку...
Опытным путем удалось установить, что ошибку вызывают строки длиной более 65КБ. (Есть ли возможность вернуть строку большей длины?)
Поступил иначе. Сделал на выходе конвертацию в массив символов (str.ToCharArray()). В итоге в каше должен получится эксемпляр класса %Library.GlobalCharacterStream. Но вместо этого получаю ошибку <LIST>.
Пробую сгенерировать тестовый массив, который заведомо больший, чем реальный:
Код: plaintext
1.
2.
            string b = "";
            for (int i = 1; i < 100000; i++) b += "a";
            return b.ToCharArray();
Однако в данном случае все работает.
Может каше не нравяться какие-то символы в массиве или еще что-то? Кто-нибудь сталкивался с подобным?
...
Рейтинг: 0 / 0
DotNetGateway и большие строки
    #37207085
mys
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
mys
Гость
Вобщем не нравятся каше в листе кириллические символы.
Сделал так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
            int size = _result.Length/65000 + 1;
            int mod = _result.Length%65000;
            string[] arr = new string[size];
            for (int i = 0; i < size; i++)
            {
                arr[i] = _result.Substring(65000*i, i < size - 1 ? 65000 : mod);
            }
            return arr;
И в каше:
Код: plaintext
1.
2.
	s r=test.DoWork(in,out,data)
	s text=""
	f i= 1 : 1 :r.Count() s text=text_r.GetAt(i)

Работает, но как-то говнокодисто вышло. Вопрос, можно ли вернуть строку >65КБ остается открытым...
...
Рейтинг: 0 / 0
DotNetGateway и большие строки
    #37207111
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mys , что это за строки у тебя такие огромные?
...
Рейтинг: 0 / 0
DotNetGateway и большие строки
    #37207124
mys
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
mys
Гость
веб-странички
...
Рейтинг: 0 / 0
DotNetGateway и большие строки
    #37207142
mys
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
mys
Гость
А на вход нельзя подать строку более 32К. Как люблю я каше... )))
...
Рейтинг: 0 / 0
DotNetGateway и большие строки
    #37207785
Turk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mysА на вход нельзя подать строку более 32К. Как люблю я каше... )))
Restrictions

mysПоступил иначе. Сделал на выходе конвертацию в массив символов (str.ToCharArray()). В итоге в каше должен получится эксемпляр класса %Library.GlobalCharacterStream. Но вместо этого получаю ошибку <LIST>.
%Library.GlobalCharacterStream не использует $listbuild-ы внутри и поэтому не должен возвращать такую ошибку. Покажите полный код (включая определение) C#-метода и сгенерированный в Cache метод прокси-класса для него.

mysвеб-странички
Может лучше в этом случае не возвращать строки, а сразу объект System.Web.HttpResponse? (Это если потом эти страницы возвращаются клиентам Web-сервера.)
...
Рейтинг: 0 / 0
DotNetGateway и большие строки
    #37209440
mys
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
mys
Гость
Turk%Library.GlobalCharacterStream не использует $listbuild-ы внутри и поэтому не должен возвращать такую ошибку. Покажите полный код (включая определение) C#-метода и сгенерированный в Cache метод прокси-класса для него.
Ошибка не в %Library.GlobalCharacterStream.

.NET класс
Код: plaintext
public class Proxy\n{\n     public char[] Test()\n     {\n           WebClient client = new WebClient();\n           client.Proxy = new WebProxy("proxy", 8080);\n           return client.DownloadString("/topic/842376").ToCharArray();\n     }\n}

Сгенерировано кашей:
Код: plaintext
\nMethod Test() As %Library.ObjectHandle\n{\n\t#; Corresponding .NET method: Test\n\tQuit ..%Execute0R(..Gateway,"Test",%this)\n}\n

Ошибка:
USER>s c=##class(Analyzer.Proxy).%New(gateway)
USER>d c.Test()
<LIST>%PostInvoke+2^Analyzer.Proxy.1


TurkМожет лучше в этом случае не возвращать строки, а сразу объект System.Web.HttpResponse? (Это если потом эти страницы возвращаются клиентам Web-сервера.)
Перед тем как эти страницы возвращать их еще надо должным образом обработать. Обработать на стороне .NET, потому что в каше для этого нет ничего, кроме $L,$F,$P,$E и т.д.... В противном случае можно было бы просто использовать %Net.HttpRequest в каше.
...
Рейтинг: 0 / 0
DotNetGateway и большие строки
    #37210500
mys
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
mys
Гость
Не совсем понятно, как передать строку больше 32К из каше в .NET сборку вообще.
1. Просто с большой строкой оно не работает. (складывается впечатление, что эта хрень вообще не умеет передавать объекты больше 32К а не только строки)
2. Если побить строку по 32к и создать массив строк, который передавать в сборку, виснет DotNetGateway полностью... (если строка <32K и бьем кусками например по 4К, то работает)
3. Если создать %GlobalCharacterStream не понятно что получать на входе в моей сборке
Если получаем char[], который следуя документации и логике мы и должны получать, ошибка:
<METHOD DOES NOT EXIST>%WriteArray+11^Analyzer.Proxy.1 *Count,%Library.GlobalCharacterStream
Еще бы, метода Count в потоках нет...
Пробую получать System.IO.Stream, получаем ошибку:
x="0 ‡џQНевозможно преобразовать объект типа "System.String" к типу "System.IO.Stream".
в System.RuntimeType.CheckValue(Object value, Binder binder, CultureInfo culture, BindingFlags invokeAttr)
в System.Reflection.MethodBase.CheckArguments(Object[] parameters, Binder binder, BindingFlags invokeAttr, CultureInfo culture, Signature sig)
в System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)
в System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
в InterSystems.Data.CacheClient.Gateway.Gateway.executeInstanceMethod(MethodInfo method, String methodName, String oref)
в InterSystems.Data.CacheClient.Gateway.Gateway.executeMethod()
Т.е., выходит на вход приходит строка вида: "6@%Library.GlobalCharacterStream"...

В примере от интерсистемз есть все, кроме передачи GlobalCharacterStream...
...
Рейтинг: 0 / 0
DotNetGateway и большие строки
    #37210554
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не уверен, что мои наблюдения тут помогут, но как-то приходилось субмитить через %request огромные куски текста.
Действительно, начиная с 32к приходит вместо строки ссылка на объект.
Но в чем проблема, определаем ситуацию, например через $isobject и читаем данные из потока.
...
Рейтинг: 0 / 0
DotNetGateway и большие строки
    #37210601
mys
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
mys
Гость
%Request...это csp?

Вобщем, сделал поле
Код: plaintext
1.
2.
3.
        public string AppendData
        {
            set { _data += value; }
        }
Дергаю его и передаю куски по 32К, а потом запускаю обработку. Но есть сомнения в производительности данного подхода, ведь все это работает на рефлексии, а рефлексия зачастую - это очень медленно...
...
Рейтинг: 0 / 0
DotNetGateway и большие строки
    #37211232
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mys ,

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
using System;
using System.Text;

namespace dll
{
  public class MyClass
  {
    public int getCharacterStream(char[] b)
    {
      var temp = "CACHÉ Этот строковый Σ поток был заполнен  в C#".PadRight(1000000,'É').ToCharArray();
      Array.Copy(temp, 0, b, 0, temp.Length);
      return temp.Length;
    }
  }
}
...
  #dim clob As %GlobalCharacterStream=##class(%GlobalCharacterStream).%New()
  
  set s=$j(" ",32767)  for i=1:1:62 d clob.Write(s)
  
  set tmp=##class(dll.MyClass).%New(GateWay)
  set r=tmp.getCharacterStream(.clob)
  
  w "Общий размер потока=",clob.Size,!
  w "Фактический размер возвращённых символов=",r,!
  w "Первые 100 символов потока=",clob.Read(100),!
...
Код: plaintext
1.
2.
3.
USER>d ^test
Общий размер потока=2031554
Фактический размер возвращённых символов=1000000
Первые 100 символов потока=CACHÉ Этот строковый Σ поток был заполнен  в C#ÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉ
...
Рейтинг: 0 / 0
DotNetGateway и большие строки
    #37211680
mys
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
mys
Гость
Повторил ваш пример, получил все ту же ошибку:
<METHOD DOES NOT EXIST>%WriteArray+11^Analyzer.Test.1 *Count,%Library.GlobalCharacterStream
Какая у вас версия? У меня Cache for Windows (x86-32) 2009.1 (Build 378) Wed Mar 11 2009 20:57:11 EDT. Может в этом дело?
...
Рейтинг: 0 / 0
DotNetGateway и большие строки
    #37211777
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mysПовторил ваш пример, получил все ту же ошибку:
<METHOD DOES NOT EXIST>%WriteArray+11^Analyzer.Test.1 *Count,%Library.GlobalCharacterStream
Какая у вас версия? У меня Cache for Windows (x86-32) 2009.1 (Build 378) Wed Mar 11 2009 20:57:11 EDT. Может в этом дело?Зачем использовать одну из первых Field Test , когда есть Release ?

PS: тестировал на 2011.1.FT1
...
Рейтинг: 0 / 0
DotNetGateway и большие строки
    #37211850
mys
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
mys
Гость
Вы правы, надо обновиться ))
Пробую запустить ваш пример на Cache for Windows (x86-32) 2010.2.3 (Build 702) Tue Feb 15 2011 14:33:55 EST
Получаю:
<LIST>%PostInvoke+2^%Net.Remote.Proxy.1
...
Рейтинг: 0 / 0
DotNetGateway и большие строки
    #37212123
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mysВы правы, надо обновиться ))
Пробую запустить ваш пример на Cache for Windows (x86-32) 2010.2.3 (Build 702) Tue Feb 15 2011 14:33:55 EST
Получаю:
<LIST>%PostInvoke+2^%Net.Remote.Proxy.1Используйте Unicode версию вместо 8-битной и всё будет работать.

PS: на версии 2010.2.3.702 (Unicode) работает.
...
Рейтинг: 0 / 0
DotNetGateway и большие строки
    #37212598
mys
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
mys
Гость
Эх, понял, очень жаль...
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / DotNetGateway и большие строки
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]