Я размещаю службу WCF на IIS. Служба имеет список MyClass
объектов, сериализует их (с Json. NET) от Newtonsoft в JSON и отправляет JSON клиенту. Список составляет около 1,2 МБ
Служба имеет два метода [WebGet]
- первый отправляет JSON MemoryStream, второй преобразует поток в строку и затем отправляет ее.
Когда я вызываю службу из браузера (Mozilla Firefox, Microsoft Edge), загрузка MemoryStream занимает где-то от двух до десяти раз дольше, чем загрузка строки. Это почему? Это плохо написанный код с моей стороны или это нормально? В Google Chrome различия еще больше - MemoryStream загружается примерно в 50 раз длиннее строки.
Вот части кода, которые я использую:
Сервисный контракт:
[ServiceContract]
public interface IJsonService
{
[OperationContract]
[WebGet]
MemoryStream GetJsonStream();
[OperationContract]
[WebGet]
string GetJsonString();
}
Сам сервис:
public class JsonService : IJsonService
{
public static List<MyClass> GetRandomListOfNObjects(int n)
{
(...)
}
//static field, just to make sure both jsons have the same data
public static List<MyClass> theData = GetRandomListOfNObjects(3000);
public MemoryStream GetJsonStream()
{
//serialization to JSON using Newtonsoft NuGet package
var ser = new JsonSerializer();
MemoryStream mem = new MemoryStream();
using (StreamWriter stW = new StreamWriter(mem))
{
using (JsonWriter jsW = new JsonTextWriter(stW))
{
ser.Serialize(jsW, theData);
}
}
return new MemoryStream(mem.ToArray());
}
public string GetJsonString()
{
//GetJsonString method calls GetJsonStream method, yet it works faster
MemoryStream mem = GetJsonStream();
StreamReader srd = new StreamReader(mem);
string ret = srd.ReadToEnd();
return ret;
}
}
Оба метода размещены на IIS. Я вызываю оба метода из браузера с помощью:
http://localhost:XXXX/ProjectName/Namespace.JsonService.svc/GetJsonStream
http://localhost:XXXX/ProjectName/Namespace.JsonService.svc/GetJsonString
Кто-нибудь знает, почему MemoryStream загружается дольше, чем строка?