在一篇文章中我们已经实现了功能,但是一个明显的问题是响应时间非常长,用户体验非常糟糕,这篇文章将带你找出问题所在并进行优化

为了找出追魁祸首,这里使用 System.Diagnostics.Stopwatch来对我们的应用程序执行进行计时。

修改一下TranslatorController中Translate中的代码

  System.Diagnostics.Stopwatch watch1 = new System.Diagnostics.Stopwatch();
System.Diagnostics.Stopwatch watch2 = new System.Diagnostics.Stopwatch();
watch1.Start();
AdmAuthentication adm = new AdmAuthentication("zuin", "Ursm3pji3Fcha+70plJFrAbHT/Y00F7vyKdXlWLusmc="); watch1.Stop();
watch2.Start(); string uri = "http://api.microsofttranslator.com/v2/Http.svc/Translate?text=" + System.Web.HttpUtility.UrlEncode(text) + "&from=" + from + "&to=" + to;
string authToken = "Bearer" + " " + adm.token.access_token; HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(uri);
httpWebRequest.Headers.Add("Authorization", authToken);
WebResponse response = null;
try
{
response = httpWebRequest.GetResponse();
using (Stream stream = response.GetResponseStream())
{
System.Runtime.Serialization.DataContractSerializer dcs = new System.Runtime.Serialization.DataContractSerializer(Type.GetType("System.String"));
string translation = (string)dcs.ReadObject(stream);
watch2.Stop();
return Json(translation+"获取令牌的时间是"+watch1.Elapsed.ToString()+" 获取翻译的时间是"+watch2.Elapsed.ToString());
}
}
catch
{
watch2.Stop();
string code = "fail";
return Json(code);
}

我们来看看效果

从上面的数据可以看出获取翻译的时间非常短,一般不会超过半分钟,而获取令牌的时间非常长,而且不稳定,这个是优化的关键

一.使用cookie和session来保存令牌

这里以cookie为例

    string access_token = "";
if (this.HttpContext.Request.Cookies["authToken"]==null)
{
AdmAuthentication adm = new AdmAuthentication("zuin", "Ursm3pji3Fcha+70plJFrAbHT/Y00F7vyKdXlWLusmc=");
access_token = adm.token.access_token; HttpCookie cookie = new HttpCookie("authToken");
cookie.Value = adm.token.access_token;
cookie.Expires = DateTime.Now.AddMinutes();
Response.Cookies.Add(cookie);
}
else
{
access_token = this.HttpContext.Request.Cookies["authToken"].ToString();
} string authToken = "Bearer" + " " + access_token;

来看看效果

使用cookie可以达到我们的目的,不用每次都去获取令牌,可以在cookie里面直接获取,令牌在10分钟内有效,所以不需要考虑安全问题。对带宽的影响也不是很大。

二.使用HttpRuntime来缓存令牌

cookie和session的数据之内给单独用户使用,独乐乐不如众乐乐,数据应该拿出来共享,这里使用HttpRuntime来解决这个问题,首先修改下代码、

 string access_token = "";
if (this.HttpContext.Cache["authToken"]==null)
{
AdmAuthentication adm = new AdmAuthentication("zuin", "Ursm3pji3Fcha+70plJFrAbHT/Y00F7vyKdXlWLusmc=");
access_token = adm.token.access_token;
this.HttpContext.Cache.Insert("authToken", access_token, null, DateTime.Now.AddMinutes(9), TimeSpan.Zero);
}
else
{
access_token = this.HttpContext.Cache["authToken"].ToString();
}

  之前使用Edge浏览器,这次使用火狐浏览器看看效果

显然也是达到了我们的目的

NOTE:

Cache 类不能在 ASP.NET 应用程序外使用。它是为在 ASP.NET 中用于为 Web 应用程序提供缓存而设计和测试的。在其他类型的应用程序(如控制台应用程序或 Windows 窗体应用程序)中,ASP.NET 缓存可能无法正常工作。(来自MSDN)

这个cache之能被我们的ASP.NET应用程序访问,依然无法取代memcached等分布式缓存。

三.使用memcached分布式缓存

首先需要在电脑安装memcached(http://memcached.org/)

在项目中引用Memcached.ClientLibrary.dll,log4net.dll,ICSharpCode.SharpZipLib.dll,Commons.dll四个程序集

封装一下操控memcached的

public class MmHelper
{
private MemcachedClient client;
public MmHelper()
{
string[] ips = System.Configuration.ConfigurationManager.AppSettings["MemcachedServers"].Split(','); SockIOPool pool = SockIOPool.GetInstance();
pool.SetServers(ips);
pool.Initialize(); client = new MemcachedClient();
client.EnableCompression = true;
} public bool Set(string key, object value, DateTime expiryTime)
{
return client.Set(key, value, expiryTime);
} public object Get(string key)
{
return client.Get(key);
} public bool Delete(string key)
{
return client.Delete(key);
}
}

修改前面的代码

   MmHelper mm = new MmHelper();
if (mm.Get("authToken")==null)
{
AdmAuthentication adm = new AdmAuthentication("zuin", "Ursm3pji3Fcha+70plJFrAbHT/Y00F7vyKdXlWLusmc=");
access_token = adm.token.access_token;
mm.Set("authToken", access_token, DateTime.Now.AddMinutes());
}
else
{
access_token = mm.Get("authToken").ToString();
}

现在来看看效果

ok!

在Application中集成Microsoft Translator服务之优化的更多相关文章

  1. 在Application中集成Microsoft Translator服务之开发前准备

    第一步:准备一个微软账号 要使用Microsoft Translator API需要在Microsoft Azure Marketplace(https://datamarket.azure.com/ ...

  2. 在Application中集成Microsoft Translator服务之使用http获取服务

    一.创建项目 首先我们来创建一个ASP.NET Application 选择时尚时尚最时尚的MVC,为了使演示的Demo更简单,这里选择无身份验证 二.创建相关类 项目需要引入之前两个类AdmAcce ...

  3. 在Application中集成Microsoft Translator服务之获取访问令牌

    我在这里画了一张图来展示业务逻辑 在我们调用microsoft translator server之前需要获得令牌,而且这个令牌的有效期为10分钟.下表列出所需的参数和对于的说明 参数 描述 clie ...

  4. 在Application中集成Microsoft Translator服务之翻译语言代码

    Microsoft  Translator支持多种语言,当我们获取服务时使用这些代码来表示我们是使用哪种语言翻译成什么语言,以下是相关语言对应的代码和中文名 为了方便我已经将数据库上传到云盘上,读者可 ...

  5. 跨平台应用集成(在ASP.NET Core MVC 应用程序中集成 Microsoft Graph)

    作者:陈希章 发表于 2017年6月25日 谈一谈.NET 的跨平台 终于要写到这一篇了.跨平台的支持可以说是 Office 365 平台在设计伊始就考虑的目标.我在前面的文章已经提到过了,Micro ...

  6. 在PowerShell脚本中集成Microsoft Graph

    作者:陈希章 发表于2017年4月23日 我旗帜鲜明地表态,我很喜欢PowerShell,相比较于此前的Cmd Shell,它有一些重大的创新,例如基于.NET的类型系统,以及管道.模块的概念等等.那 ...

  7. 在无人值守程序(服务)中调用Microsoft Graph

    作者:陈希章 发表于 2017年5月31日 什么是无人值守程序(服务) 我在此前用了几篇文章分别介绍了在桌面应用程序(控制台),Web应用程序(ASP.NET MVC),以及PowerSehll脚本中 ...

  8. 在ASP.NET Web Application中通过SOAP协议调用Bing搜索服务

    本文介绍了如何在ASP.NET Web Application中将Bing搜索作为Web Service来使用,并通过HTTP的SOAP协议在ASP.NET Web Application中调用Bin ...

  9. Api网关Kong集成Consul做服务发现及在Asp.Net Core中的使用

    写在前面   Api网关我们之前是用 .netcore写的 Ocelot的,使用后并没有完全达到我们的预期,花了些时间了解后觉得kong可能是个更合适的选择. 简单说下kong对比ocelot打动我的 ...

随机推荐

  1. ARM汇编程序结构

    ARM汇编程序结构 一个ARM程序可以被划分为多个代码段和数据段,在汇编的时候这些段会被形成一个可执行文件 .text ;正文段,包含程序的指令代码 .data ;数据段,包含固定的数据,如常量,字符 ...

  2. MongoDB数据库用户名和密码的设置

    首先是对MongoDB用户和权限的设置,如果不设置用户的话,直接使用mongo命令就可以进入客户端shell界面进行操作了,但是如果没有设置用户的话,总感觉少了点什么,于是经过半天的查找和实践,差不多 ...

  3. 【转帖】嵌入式4412开发板QT5.7编译安装到arm

    QT5.7.0+UBUNTU16.04+ARM-NONE-LINUX-GNUEABI4.8+busybox最小LINUX系统 Orandragon记录 本文转自迅为4412开发板群:http://to ...

  4. OpenFlow:Enabling Innovation in Campus Networks

    SDN领域,OpenFLow现在已经成为了广泛使用的南向接口协议.若想好好学习SDN,在这个领域有所进步,需要熟悉OpenFlow协议.我最近找了篇有关OpenFLow的论文,发现最早该协议是在Sig ...

  5. 第11章 Java异常与异常处理

    1.Java异常简介 1.什么是异常异常出现的时候代码会无法正常运行下去,会产生各种问题2.捕捉异常的作用提早发现异常,方便查找问题,并给出解决方法3.Java中的异常1.Java中所有不正常的类都是 ...

  6. 如何保证ArrayList线程安全

    一.继承Arraylist,然后重写或按需求编写自己的方法,这些方法要写成synchronized,在这些synchronized的方法中调用ArrayList的方法.   二:使用Collectio ...

  7. jdbc java数据库连接 1)jdbc入门

      之前操作数据 1)通过mysql的客户端工具,登录数据库服务器  (mysql -u root -p 密码) 2)编写sql语句 3)发送sql语句到数据库服务器执行 什么是jdbc? 使用jav ...

  8. 去除多余的cell 和最后一行cell显示顶头底线

    去除多余cell YourTableview.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero]; 最后一行cell底线顶头显示 s ...

  9. 10款.net 图形插件

    在如今这个读图时代,图形图表的可视化数据表现形式已成为一种趋势.因为图表能直观的展示信息.对比和趋势等,所以许多项目开发中都需要用到图表控件,而很多图表控件都是在.NET平台下开发的,今天就为大家推荐 ...

  10. vs2015 安装之后安装MSSM 2016 导致 vs启动报错 System.ArgumentException 已添加了具有相同键的项,ActivityLog.xml

    如题,先是装了vs2015,开发什么的都没有问题,后来安装了SqlServer2016 MSSM,出大问题了,vs2015打开就报错,具体错误如上,还想还有个ActivityLog.xml 这个文件的 ...