C# Windows Phone 8上WCF服务的性能问题

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响应连接

我将制作一个WindowsPhone8应用程序,从WCF服务获取他的数据。现在我刚刚开始wp8的开发,我想知道WCF是否是我最好的选择。毕竟,wsdl服务在每个响应中都会发送大量xml额外数据和格式,这对于手机应用程序来说并不是最好的。我的问题是:使用WCF和它的大XML响应可以吗?或者我应该尝试其他方法,比如httpHandlers,它返回JSON数据和动态gzip响应?不确定他们是否会使用WP8,但正如我所说,我想知道我自己的正确方向是什么。

感谢所有的帮助。我决定使用WCF和JSON响应连接到我的windows phone 8应用程序。。我并没有完全选择WCF,这是任务的一部分,但我将使用WCF的内置身份验证和授权系统以及用户凭据。。每次我都将以JSON格式序列化响应,然后在返回时将其GZIP。通过我适度的测试,结果是安静快速。如果其他人对此感到疑惑,以下是一些示例代码(我使用的是JSON.NET):


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();
    }