C# Windows Phone 8上WCF服务的性能问题
我将制作一个WindowsPhone8应用程序,从WCF服务获取他的数据。现在我刚刚开始wp8的开发,我想知道WCF是否是我最好的选择。毕竟,wsdl服务在每个响应中都会发送大量xml额外数据和格式,这对于手机应用程序来说并不是最好的。我的问题是:使用WCF和它的大XML响应可以吗?或者我应该尝试其他方法,比如httpHandlers,它返回JSON数据和动态gzip响应?不确定他们是否会使用WP8,但正如我所说,我想知道我自己的正确方向是什么。感谢所有的帮助。我决定使用WCF和JSON响应连接到我的windows phone 8应用程序。。我并没有完全选择WCF,这是任务的一部分,但我将使用WCF的内置身份验证和授权系统以及用户凭据。。每次我都将以JSON格式序列化响应,然后在返回时将其GZIP。通过我适度的测试,结果是安静快速。如果其他人对此感到疑惑,以下是一些示例代码(我使用的是JSON.NET):C# Windows Phone 8上WCF服务的性能问题,c#,asp.net,performance,wcf,windows-phone-8,C#,Asp.net,Performance,Wcf,Windows Phone 8,我将制作一个WindowsPhone8应用程序,从WCF服务获取他的数据。现在我刚刚开始wp8的开发,我想知道WCF是否是我最好的选择。毕竟,wsdl服务在每个响应中都会发送大量xml额外数据和格式,这对于手机应用程序来说并不是最好的。我的问题是:使用WCF和它的大XML响应可以吗?或者我应该尝试其他方法,比如httpHandlers,它返回JSON数据和动态gzip响应?不确定他们是否会使用WP8,但正如我所说,我想知道我自己的正确方向是什么。感谢所有的帮助。我决定使用WCF和JSON响应连接
WCF本身并不意味着必须使用XML。它可以很容易地用json(或tcp)生成响应。是的,但这是否意味着可以使用为WP8返回json的WCF?嗯?SOAP的“开销”不适用于JSON。SOAP的开销不是由WCF引起的,而是由SOAP引起的。我将使用带有JSON的WCF。它是相当轻的,因为它只是一个字符串。如果您不喜欢默认的JSON解析实用程序,那么也有很多JSON解析实用程序。一般来说,使用WCF的原因只有两个:wsdl和广泛的传输支持(net.tcp和管道)。所以,如果您需要HTTP服务而不关心wsdl,我会选择WebApi。它们都可以是自托管的或IIS托管的。WCF更容易与Windows身份验证集成,但WebAPI更容易学习。所以我投票支持WebAPI。
private string GetSuppliersLite()
{
// Get the ObjectContext that is the data source for the service.
NorthwindEntities context = this.CurrentDataSource;
try
{
var suppliers = (from s in context.Suppliers
select new
{
Address = s.Address,
City = s.City,
CompanyName = s.Company_Name,
ContactName = s.Contact_Name,
ContactTitle = s.Contact_Title,
Country = s.Country,
Fax = s.Fax,
Phone = s.Phone,
PostalCode = s.Postal_Code,
Region = s.Region,
SupplierID = s.Supplier_ID,
}
).ToList();
string jsonClient = null;
JsonSerializer jsonSerializer = new JsonSerializer();
jsonSerializer.NullValueHandling = NullValueHandling.Ignore;
jsonSerializer.MissingMemberHandling = MissingMemberHandling.Error;
jsonSerializer.ReferenceLoopHandling = ReferenceLoopHandling.Error;
try
{
using (StringWriter sw = new StringWriter())
{
using (JsonTextWriter jtw = new JsonTextWriter(sw))
{
jsonSerializer.Serialize(jtw, suppliers);
}
jsonClient = sw.ToString();
}
}
catch (Exception ex)
{
ex = ex; // have a breakpoint here so can inspect exception
}
return jsonClient;
}
catch (Exception ex)
{
throw new ApplicationException(string.Format(
"An error occurred: {0}", ex.Message));
}
}
[WebGet]
public string GetSuppliersLiteZip()
{
return Zip(GetSuppliersLite());
}
private string Zip(string value)
{
//Transform string into byte[]
byte[] byteArray = new byte[value.Length];
int indexBA = 0;
foreach (char item in value.ToCharArray())
{
byteArray[indexBA++] = (byte)item;
}
//Prepare for compress
System.IO.MemoryStream ms = new System.IO.MemoryStream();
System.IO.Compression.GZipStream sw = new System.IO.Compression.GZipStream(ms, System.IO.Compression.CompressionMode.Compress);
//Compress
sw.Write(byteArray, 0, byteArray.Length);
//Close, DO NOT FLUSH cause bytes will go missing...
sw.Close();
//Transform byte[] zip data to string
byteArray = ms.ToArray();
System.Text.StringBuilder sB = new System.Text.StringBuilder(byteArray.Length);
foreach (byte item in byteArray)
{
sB.Append((char)item);
}
ms.Close();
sw.Dispose();
ms.Dispose();
return sB.ToString();
}