GVKun编程网logo

asp.net-web-api – 在Bot框架中自动部署(Bot LUIS QnA表存储)

14

在本文中,我们将给您介绍关于asp.net-web-api–在Bot框架中自动部署(BotLUISQnA表存储)的详细内容,此外,我们还将为您提供关于ASP.NETMVC/WebApi的Azure表存

在本文中,我们将给您介绍关于asp.net-web-api – 在Bot框架中自动部署(Bot LUIS QnA表存储)的详细内容,此外,我们还将为您提供关于ASP.NET MVC / WebApi的Azure表存储最佳实践、ASP.NET MVC5 + EF6 + Bootstrap3 (7) Bootstrap的栅格系统_html/css_WEB-ITnose、ASP.NET webform的Bootstrap、asp.net-mvc – 使用Facebook和Twitter登录ASP.NET Web API的知识。

本文目录一览:

asp.net-web-api – 在Bot框架中自动部署(Bot LUIS QnA表存储)

asp.net-web-api – 在Bot框架中自动部署(Bot LUIS QnA表存储)

我们在Azure上部署了一个机器人,但是我们希望将它提供给客户端,以便他可以使用自己的资源来部署它.我们需要为他们提供一个Power shell脚本,该脚本可以神奇地创建和部署机器人工作所需的所有资源.我的bot架构包含以下部分:

> Bot的逻辑(通过Azure应用服务部署的ASP.NET Web API项目)
> LUIS模型(通过认知服务帐户发布)
>使用QnA Maker完成的QnA服务知识库(直接从QnaMaker Portal发布(不知道它在何处部署)
> Azure表存储

我的问题是:

1)如何配置机器人web api到连接字符串参数? (表存储,luis和qna服务在重新部署时会有所不同)目前我正在定义conn. web.config上的字符串和api键,但正如我所说,这需要是动态的.

2)如何自动部署LUIS? Luis需要首先创建认知服务帐户的密钥.我假设我有导出的模型json文件.我正在考虑使用LUIS API来执行应用程序导出和发布部分.那就够了吗?

3)如何部署qna服务?我认为目前在神奇的地方部署,所以也许我不需要做任何事情.

谢谢!

解决方法

也许有点晚了,但我只需要实现同样的事情,所以这里是你的问题的答案,希望它们可能对其他人有用:

1)正如上面提到的JoyrexJ9,您可以通过设置App Service的应用程序设置来通过ARM模板执行此操作,该应用程序设置将覆盖Web.config中的值.更多关于这here.

>您可以将ARM模板中的存储帐户的连接字符串放在一起并设置如下:

{
  "type": "Microsoft.Web/sites","kind": "app","name": "MyWebApp","apiVersion": "2015-08-01","location": "westeurope","properties": {
    "name": "MyWebApp","serverFarmId": "[resourceId('Microsoft.Web/serverfarms','MyAppServicePlanName')]","siteConfig": {
      "appSettings": [{
        "name": "StorageConnectionString","value": "[concat('DefaultEndpointsProtocol=https;AccountName=','MyStorageAccountName',';AccountKey=',listKeys(resourceId('Microsoft.Storage/storageAccounts','MyStorageAccountName'),'2017-10-01').keys[0].value,';EndpointSuffix=core.windows.net')]"
      }],"cors": {
        "allowedOrigins": [
          "*"
        ]
      }
    }
  },"dependsOn": [
    "[resourceId('Microsoft.Storage/storageAccounts/','MyStorageAccountName')]","[resourceId('Microsoft.Web/serverfarms','MyAppServicePlanName')]"
  ]
}

>对于LUIS和QnA制造商,您需要手动从各个门户获取值,并在手动ARM部署后更新应用程序设置,或者使用手动获取的值作为参数重新运行ARM部署.后者的工作原理是因为您第一次可以在ARM模板中将这些值保留为空,并且在第二次使用参数值进行部署时,ARM将只更新这些应用程序设置值.有关此主题的更多信息here.
(提示:如果您通过API编程配置QnA Maker和LUIS应用程序,那么您只需手动获取LUIS的订阅密钥,因为您将从QnA Maker的API获取知识库的凭据.)

2)遗憾的是,您现在无法完全自动配置LUIS应用程序.您可以通过ARM模板在Azure中创建资源,您可以通过LUIS API完成大部分其余工作,但是例如,您无法以编程方式将ARM模板创建的订阅密钥分配给LUIS应用程序,因为that API method is deprecated .

3)自您提交问题以来,QnA Maker服务及其托管模式发生了重大变化.我写了一篇关于如何在新系统中配置它的完整blog post.

正如上面提到的JoyrexJ9,非常重要的是要指出即使使用脚本也无法完全自动化机器人注册,因为在https://apps.dev.microsoft.com/没有用于注册应用程序的API.您还必须手动执行此操作.其他所有内容(除了我上面提到的内容)都可以通过ARM模板或脚本完全自动化.

ASP.NET MVC / WebApi的Azure表存储最佳实践

ASP.NET MVC / WebApi的Azure表存储最佳实践

从ASP.NET MVC或Web API应用程序连接到Azure表存储的最佳实践是什么?

现在我已经创建了一个StorageContext类,它包含对CloudStorageAccount和CloudTableClient的引用,如下所示:

public class StorageContext
{
    private static CloudStorageAccount _storageAccount;
    private static CloudTableClient _tableClient;

    public StorageContext() : this("StorageConnectionString") { }

    public StorageContext(string connectionString)
    {
        if (_storageAccount == null)
            _storageAccount = CloudStorageAccount.Parse(ConfigurationManager.ConnectionStrings[connectionString].ConnectionString);

        if (_tableClient == null)
            _tableClient = _storageAccount.CreateCloudTableClient();
    }

    public CloudTable Table(string tableName)
    {
        var table = _tableClient.GetTableReference(tableName);

        table.CreateIfNotExists();

        return table;
    }
}

而我的控制器我正在使用它:

public class HomeController : ApiController
{
    private StorageContext db;

    public HomeController() : this(new StorageContext()) { }

    public HomeController(StorageContext context)
    {
        this.db = context;
    }

    public IHttpActionResult Get()
    {
        var table = db.Table("users");
        var results = (from user in table.createquery<User>()
                       select user).Take(10).ToList();

        return Ok<List<User>>(results);
    }
}

这是首选方式吗?

该API将用于具有>的高流量站点. 1000 req / sec.

我还需要单元测试.像上面一样使用它我可以传入另一个connString名称,而是在我的单元测试中连接到Azure存储模拟器.

我是在正确的轨道上还是有更好的连接方式?

解决方法

其实你的问题

What are the best practices for connecting to a Azure Table Storage
from a ASP.NET MVC or Web API app?

可以像“在Web应用程序中使用数据访问层的最佳实践”一样进行重述.这是相同的.

您可以找到有关数据访问层最佳实践的大量答案.但是,铁规则会将您的数据访问层与您的控制器或演示文稿分开.在MVC模式范围内通过Model使用它的最佳方法,或者如果您喜欢它们,您可以考虑Repository和/或Unit of work模式.

在您的示例中,您的数据访问逻辑已经包含在StorageContext中,这很好,我还要提取接口并使用DI / IoC和依赖解析器.这就是谈论你的代码片段时的全部内容.你正确的方式.

ASP.NET MVC5 + EF6 + Bootstrap3 (7) Bootstrap的栅格系统_html/css_WEB-ITnose

ASP.NET MVC5 + EF6 + Bootstrap3 (7) Bootstrap的栅格系统_html/css_WEB-ITnose

文章来源:  

上一节:ASP.NET MVC5 + EF6 入门教程 (6) View中的Razor使用

源码下载:点我下载

要做一个完整的系统,除了需要MVC这样的B/S框架及EF这样的数据库访问技术之外,一个简洁、美观、大方的UI框架也是必不可少的。

话不多说,有请今天的主角登场!!

立即学习“前端免费学习笔记(深入)”;

看看它的自我介绍,是不是很?。没错,这个介绍一点都不夸张。

回想起第一次工作中用Bootstrap做了一个专题网站,我们外籍老板就说了一个字:Amazing!

从来没有一款UI框架可以给我如此震撼,如此耳目一新的感觉。

再上一个应用了Bootstrap的网站主页:

回到正题,其实在我们的教学项目中已经默认包含了Bootstrap3的UI框架,请看解决方案资源管理器的Content和Scripts文件夹:

其中bootstrap.css和bootstrap.min.css的功能是完全一样的。只是bootstrap.css格式整齐,适合查看编辑。bootstrap.min.css去掉了没用的格式上的东西,体积小页面载入速度快。bootstrap.js和bootstrap.min.js也是这个关系。

下面进入正题,介绍Bootstrap的栅格系统。

什么是栅格系统?先来个实例。

在解决方案资源管理器 Views\First\Index.cshtml文件中,删除掉原有代码,写入下面代码。

<html><head>    @Styles.Render("~/Content/css")    <style>        div div div{            border:solid 1px gray;            margin-top:3px;            background:#cccccc;            text-align:center;        }    </style></head><body>    <div id="width"></div>    <div>        <div>            <div>.col-md-1</div>            <div>.col-md-1</div>            <div>.col-md-1</div>            <div>.col-md-1</div>            <div>.col-md-1</div>            <div>.col-md-1</div>            <div>.col-md-1</div>            <div>.col-md-1</div>            <div>.col-md-1</div>            <div>.col-md-1</div>            <div>.col-md-1</div>            <div>.col-md-1</div>        </div>        <div>            <div>.col-md-3</div>            <div>.col-md-3</div>            <div>.col-md-3</div>            <div>.col-md-3</div>        </div>        <div>            <div>.col-md-6</div>            <div>.col-md-6</div>        </div>        <div>            <div>.col-md-12</div>        </div>    </div>    @Scripts.Render("~/bundles/jquery")    <script>        function setWidth() {            $(''#width'').text("Window width:" + document.body.clientWidth);        }        setInterval("setWidth()", 100);    </script></body></html>
登录后复制

点击在浏览器中查看按钮,可以看到如下结果。下图中一行一行、一列一列的东西就是栅格。上面代码中@Styles.Render("~/Content/css")的作用是引入Content文件夹下的所有css文件。中的代码是为了清晰的显示出如下所示的栅格效果。而下面的<script>...</script>是为了在页面左上角实时显示页面宽度,后面会用到。

由下面的效果图可以看出栅格一行最多为12列。我们首先关注每个格子的class的最后的数字。很显然,1占一列,2占两列,依次类推。一行的总和到12就能把一行12列填满。但是不一定要填满,可以少也可以多,后面会讲到。

.col-md-1中的md是什么意思呢?它定义了一个页面的临界值。当页面宽度大于这个临界值时,一行的每一个格子会水平排列,而页面宽度小于临界值时格子会竖直排列。这样的好处是使页面可以适应不同宽度的屏幕,当屏幕宽度减小时,竖直排列以使内容不受挤压。

是不是有点晕?来个例子。

将上面Index.cshtml的

...
中的内容换成如下代码:

    <div>        <div>            <div>.col-lg-6</div>            <div>.col-lg-6</div>        </div>        <div>            <div>.col-md-6</div>            <div>.col-md-6</div>        </div>        <div>            <div>.col-sm-6</div>            <div>.col-sm-6</div>        </div>        <div>            <div>.col-xs-6</div>            <div>.col-xs-6</div>        </div>    </div>
登录后复制

看上面代码,除了md之外还有lg、sm、xs。现在我们来执行这个页面改变宽度来看看是什么效果。

宽度1222px所有行没有竖直排列。

宽度1080px,lg行竖直排列。这是因为lg行的临界宽度是1200px,小于此宽度即会竖直排列。大于这个临界值的屏幕被定义为大桌面显示器,因此标有lg的栅格就会在大桌面显示器中水平排列而在小于它的显示器中竖直排列。

继续缩到901px,md行也竖直排列,其临界宽度为992px。992px到1200px的屏幕被定义为桌面显示器,即标有md的栅格在大于等于桌面显示器宽度时水平显示,而小于它时竖直排列。

接着缩到640px,sm行也竖直排列,其临界宽度为768px。768px到992px的屏幕被定义为平板,因此有sm标记的栅格在大于等于平板宽度的屏幕中水平显示而在小于平板的屏幕中竖直排列。

接着再缩小屏幕宽度的话,带有xs标记的栅格也不会竖直排列。屏幕宽度小于768px的屏幕被定义为手机。因此标有xs的栅格在任何屏幕中都会水平排列。

再次强调一下,这种根据屏幕宽度变化排列方式的栅格是为了使显示的内容在各种屏幕中都能有足够的显示宽度,不会被挤得太窄。

说完.col-md-1这类元素,我们再看看其它元素。

包裹这些.col-md-1的列元素的是形如

的行元素。每一个行元素可以被若干个列数和为12的列元素填满。

要形成一个完整的栅格系统,在几个行元素之外还需要一个容器。这个容器有两种,一种是container一种是container-fluid。

将上面的Index.cshtml文件的

...
的内容替换成下面内容:

<div>        <div>            <div>.col-sm-6</div>            <div>.col-sm-6</div>        </div>        <div>            <div>.col-md-4</div>            <div>.col-md-4</div>            <div>.col-md-4</div>        </div>    </div>    <br/>    <div>        <div>            <div>.col-sm-6</div>            <div>.col-sm-6</div>        </div>        <div>            <div>.col-md-4</div>            <div>.col-md-4</div>            <div>.col-md-4</div>        </div>    </div>
登录后复制

运行页面得到结果如下。container的每列宽度及整体宽度是一个固定值而container-fluid的宽度是100%随其所在的父元素的宽度的变化而变化,其每列的宽度自然是总宽度的十二分之一。

当一行的列数和多余或少于12会怎样呢?运行下面栅格。

<div>        <div>            <div>.col-xs-4</div>            <div>.col-xs-3</div>        </div>        <div>            <div>.col-xs-4</div>            <div>.col-xs-5</div>            <div>.col-xs-2</div>            <div>.col-xs-5</div>            <div>.col-xs-3</div>        </div>    </div>
登录后复制

运行结果如下:

第一行一共7列后面5列空缺,可以看到当列数不足12时,栅格从左往右排列,不够的会空出来。第二行一共19列,多出来的部分另起了一行依然是从左往右拍,看起来跟一个新行没有区别。

每一个栅格默认都是左对齐,从左向右依次排列,是不是有点死板。Ok,我们来用列偏移,把他们放到我们想要的位置,做个金字塔怎么样?

代码如下:

<div>        <div>            <div>.col-md-1 .col-md-offset-5</div>        </div>        <div>            <div>.col-md-3 .col-md-offset-4</div>        </div>        <div>            <div>.col-md-5 .col-md-offset-3</div>        </div>        <div>            <div>.col-md-7 .col-md-offset-2</div>        </div>        <div>            <div>.col-md-9 .col-md-offset-1</div>        </div>    </div>
登录后复制

代码中col-md-offset-2的意思是向右平移2列,所以第一行列宽1向右平移5列,第二行列宽3向右平移4列,依次类推。效果如下图:

只能向右平移?这不能满足我。我们得要栅格变换像洗牌一样唰唰唰打乱,看代码:

<div>        <div>            <div>1</div>            <div>2</div>            <div>3</div>            <div>4</div>            <div>5</div>            <div>6</div>        </div>        <div>            <div>1</div>            <div>2</div>            <div>3</div>            <div>4</div>            <div>5</div>            <div>6</div>        </div></div>
登录后复制

看结果:

从代码上看第一行和第二行div的顺序都是123456,怎么第二行就被洗牌了?那就多亏了push和pull。例如第一行1在第一列,而在第二行它被推到了第五列,因为1的div中有push-4把它推了4列。同理在第一行里的6在第六列在第二行里跑到了第四列,因为它被拉回去两列即pull-2。其他的同理。

其实栅格不仅可以来回动,还能像洋葱一样一层层嵌套。就是col里放row,row里放col,col里再放row...

示例代码如下:

<div>        <div>            <div>Level 1</div>            <div>Level 1</div>        </div>        <div>            <div>Level 1</div>            <div>                Level 1<div>                    <div>Level 2</div>                    <div>Level 2</div>                </div>                <div>                    <div>Level 2</div>                    <div>                        Level 2<div>                            <div>Level 3</div>                            <div>Level 3</div>                        </div>                        <div>                            <div>Level 3</div>                            <div>Level 3</div>                        </div>                    </div>                </div>            </div>        </div>    </div>
登录后复制

结果如下:

 至此,Bootstrap栅格系统已被玩坏。小弟也已精疲力尽。

各位大侠给几个推荐和留言打赏吧?

上一节:ASP.NET MVC5 + EF6 入门教程 (6) View中的Razor使用

ASP.NET webform的Bootstrap

ASP.NET webform的Bootstrap

我想在ASP webforms上学习twitter bootstrap,有人能告诉我如何在从站点地图数据源加载的菜单控件上应用bootstrap.如果有专门针对webform的教程链接,我将不胜感激.谢谢

解决方法

本教程很好:

http://geekswithblogs.net/JeremyMorgan/archive/2012/09/18/how-to-use-twitter-bootstrap-on-an-asp.net-website.aspx

这是一个非常普遍的问题,但基本上你想为你的web控件分配一个DOM ID,而javascript看起来与你在Twitter Bootstrap示例中看到的几乎相同.

asp.net-mvc – 使用Facebook和Twitter登录ASP.NET Web API

asp.net-mvc – 使用Facebook和Twitter登录ASP.NET Web API

我将深入研究ASP.NET Web API,并想知道是否有一种简单的方法让我的用户使用Facebook和Twitter登录?

解决方法

随着Visual Studio 2012和.NEt 4.5的新版本,Microsoft已经完全使用OAuth / OpenID.

Article with examples on how to support Facebook,Twitter,and Google accounts
(底部还有3篇博客文章链接).

来自S. Hanselmann的here’s a sweet little video也不少.

今天关于asp.net-web-api – 在Bot框架中自动部署(Bot LUIS QnA表存储)的分享就到这里,希望大家有所收获,若想了解更多关于ASP.NET MVC / WebApi的Azure表存储最佳实践、ASP.NET MVC5 + EF6 + Bootstrap3 (7) Bootstrap的栅格系统_html/css_WEB-ITnose、ASP.NET webform的Bootstrap、asp.net-mvc – 使用Facebook和Twitter登录ASP.NET Web API等相关知识,可以在本站进行查询。

本文标签: