Merge branch 'master' into forms-refresh

This commit is contained in:
Robin-Manuel Thiel 2018-10-17 18:14:58 +02:00 коммит произвёл GitHub
Родитель a4f2ba99ac 3055f25986
Коммит 610091471f
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
58 изменённых файлов: 2723 добавлений и 2299 удалений

Просмотреть файл

@ -0,0 +1,15 @@
{
"name": "ContosoMaintenance.Bot",
"services": [
{
"type": "endpoint",
"name": "development",
"endpoint": "http://localhost:3978/api/messages",
"appId": "",
"appPassword": "",
"id": "1"
}
],
"padlock": "",
"version": "2.0"
}

Просмотреть файл

@ -0,0 +1,26 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp2.0</TargetFramework>
<CodeAnalysisRuleSet>EchoBotWithCounter.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<ItemGroup>
<Content Include="BotConfiguration.bot">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore" Version="2.1.3" />
<PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.7" />
<PackageReference Include="Microsoft.Bot.Builder" Version="4.0.8" />
<PackageReference Include="Microsoft.Bot.Builder.Integration.AspNet.Core" Version="4.0.8" />
<PackageReference Include="Microsoft.Bot.Configuration" Version="4.0.8" />
<PackageReference Include="Microsoft.Bot.Connector" Version="4.0.8" />
<PackageReference Include="Microsoft.Bot.Schema" Version="4.0.8" />
<PackageReference Include="Microsoft.Extensions.Logging.AzureAppServices" Version="2.1.1" />
</ItemGroup>
</Project>

19
Backend/Bot/CounterState.cs Executable file
Просмотреть файл

@ -0,0 +1,19 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
namespace ContosoMaintenance.Bot
{
/// <summary>
/// Stores counter state for the conversation.
/// Stored in <see cref="Microsoft.Bot.Builder.ConversationState"/> and
/// backed by <see cref="Microsoft.Bot.Builder.MemoryStorage"/>.
/// </summary>
public class CounterState
{
/// <summary>
/// Gets or sets the number of turns in the conversation.
/// </summary>
/// <value>The number of turns in the conversation.</value>
public int TurnCount { get; set; } = 0;
}
}

Просмотреть файл

@ -0,0 +1,33 @@
{
"version": "1.0",
"resources": [
{
"type": "endpoint",
"id": "1",
"name": "development",
"url": "http://localhost:3978/api/messages"
},
{
"type": "endpoint",
"id": "2",
"name": "production",
"url": "https://your-bot-url.azurewebsites.net/api/messages"
},
{
"type": "abs",
"id": "3",
"name": "ContosoMaintenance.Bot-abs"
},
{
"type": "appInsights",
"id": "4",
"name": "ContosoMaintenance.Bot-insights"
},
{
"type": "blob",
"id": "5",
"name": "ContosoMaintenance.Bot-blob",
"container": "botstatestore"
}
]
}

48
Backend/Bot/EchoBotAccessors.cs Executable file
Просмотреть файл

@ -0,0 +1,48 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
using System;
using Microsoft.Bot.Builder;
namespace ContosoMaintenance.Bot
{
/// <summary>
/// This class is created as a Singleton and passed into the IBot-derived constructor.
/// - See <see cref="EchoWithCounterBot"/> constructor for how that is injected.
/// - See the Startup.cs file for more details on creating the Singleton that gets
/// injected into the constructor.
/// </summary>
public class EchoBotAccessors
{
/// <summary>
/// Initializes a new instance of the <see cref="EchoBotAccessors"/> class.
/// Contains the <see cref="ConversationState"/> and associated <see cref="IStatePropertyAccessor{T}"/>.
/// </summary>
/// <param name="conversationState">The state object that stores the counter.</param>
public EchoBotAccessors(ConversationState conversationState)
{
ConversationState = conversationState ?? throw new ArgumentNullException(nameof(conversationState));
}
/// <summary>
/// Gets the <see cref="IStatePropertyAccessor{T}"/> name used for the <see cref="CounterState"/> accessor.
/// </summary>
/// <remarks>Accessors require a unique name.</remarks>
/// <value>The accessor name for the counter accessor.</value>
public static string CounterStateName { get; } = $"{nameof(EchoBotAccessors)}.CounterState";
/// <summary>
/// Gets or sets the <see cref="IStatePropertyAccessor{T}"/> for CounterState.
/// </summary>
/// <value>
/// The accessor stores the turn count for the conversation.
/// </value>
public IStatePropertyAccessor<CounterState> CounterState { get; set; }
/// <summary>
/// Gets the <see cref="ConversationState"/> object for the conversation.
/// </summary>
/// <value>The <see cref="ConversationState"/> object.</value>
public ConversationState ConversationState { get; }
}
}

Просмотреть файл

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<RuleSet Name="Microsoft Managed Recommended Rules" Description="These rules focus on the most critical problems in your code, including potential security holes, application crashes, and other important logic and design errors. It is recommended to include this rule set in any custom rule set you create for your projects." ToolsVersion="10.0">
<Localization ResourceAssembly="Microsoft.VisualStudio.CodeAnalysis.RuleSets.Strings.dll" ResourceBaseName="Microsoft.VisualStudio.CodeAnalysis.RuleSets.Strings.Localized">
<Name Resource="MinimumRecommendedRules_Name" />
<Description Resource="MinimumRecommendedRules_Description" />
</Localization>
<Rules AnalyzerId="StyleCop.Analyzers" RuleNamespace="StyleCop.Analyzers">
<Rule Id="SA1011" Action="None" />
<Rule Id="SA1200" Action="None" />
<Rule Id="SA1101" Action="None" />
<Rule Id="SA1129" Action="None" />
<Rule Id="SA1305" Action="Warning" />
<Rule Id="SA1309" Action="None" />
<Rule Id="SA1412" Action="Warning" />
<Rule Id="SA1600" Action="None" />
<Rule Id="SA1609" Action="Warning" />
<Rule Id="SA1633" Action="None" />
</Rules>
<Rules AnalyzerId="AsyncUsageAnalyzers" RuleNamespace="AsyncUsageAnalyzers">
<Rule Id="AvoidAsyncVoid" Action="Warning" />
</Rules>
</RuleSet>

Просмотреть файл

@ -0,0 +1,88 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Bot.Builder;
using Microsoft.Bot.Schema;
using Microsoft.Extensions.Logging;
namespace ContosoMaintenance.Bot
{
/// <summary>
/// Represents a bot that processes incoming activities.
/// For each user interaction, an instance of this class is created and the OnTurnAsync method is called.
/// This is a Transient lifetime service. Transient lifetime services are created
/// each time they're requested. For each Activity received, a new instance of this
/// class is created. Objects that are expensive to construct, or have a lifetime
/// beyond the single turn, should be carefully managed.
/// For example, the <see cref="MemoryStorage"/> object and associated
/// <see cref="IStatePropertyAccessor{T}"/> object are created with a singleton lifetime.
/// </summary>
/// <seealso cref="https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-2.1"/>
public class EchoWithCounterBot : IBot
{
private readonly EchoBotAccessors _accessors;
private readonly ILogger _logger;
/// <summary>
/// Initializes a new instance of the <see cref="EchoWithCounterBot"/> class.
/// </summary>
/// <param name="accessors">A class containing <see cref="IStatePropertyAccessor{T}"/> used to manage state.</param>
/// <param name="loggerFactory">A <see cref="ILoggerFactory"/> that is hooked to the Azure App Service provider.</param>
/// <seealso cref="https://docs.microsoft.com/en-us/aspnet/core/fundamentals/logging/?view=aspnetcore-2.1#windows-eventlog-provider"/>
public EchoWithCounterBot(EchoBotAccessors accessors, ILoggerFactory loggerFactory)
{
if (loggerFactory == null)
{
throw new System.ArgumentNullException(nameof(loggerFactory));
}
_logger = loggerFactory.CreateLogger<EchoWithCounterBot>();
_logger.LogTrace("EchoBot turn start.");
_accessors = accessors ?? throw new System.ArgumentNullException(nameof(accessors));
}
/// <summary>
/// Every conversation turn for our Echo Bot will call this method.
/// There are no dialogs used, since it's "single turn" processing, meaning a single
/// request and response.
/// </summary>
/// <param name="turnContext">A <see cref="ITurnContext"/> containing all the data needed
/// for processing this conversation turn. </param>
/// <param name="cancellationToken">(Optional) A <see cref="CancellationToken"/> that can be used by other objects
/// or threads to receive notice of cancellation.</param>
/// <returns>A <see cref="Task"/> that represents the work queued to execute.</returns>
/// <seealso cref="BotStateSet"/>
/// <seealso cref="ConversationState"/>
/// <seealso cref="IMiddleware"/>
public async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default(CancellationToken))
{
// Handle Message activity type, which is the main activity type for shown within a conversational interface
// Message activities may contain text, speech, interactive cards, and binary or unknown attachments.
// see https://aka.ms/about-bot-activity-message to learn more about the message and other activity types
if (turnContext.Activity.Type == ActivityTypes.Message)
{
// Get the conversation state from the turn context.
var state = await _accessors.CounterState.GetAsync(turnContext, () => new CounterState());
// Bump the turn count for this conversation.
state.TurnCount++;
// Set the property using the accessor.
await _accessors.CounterState.SetAsync(turnContext, state);
// Save the new turn count into the conversation state.
await _accessors.ConversationState.SaveChangesAsync(turnContext);
// Echo back to the user whatever they typed.
var responseMessage = $"Turn {state.TurnCount}: You sent '{turnContext.Activity.Text}'\n";
await turnContext.SendActivityAsync(responseMessage);
}
else
{
await turnContext.SendActivityAsync($"{turnContext.Activity.Type} event detected");
}
}
}
}

38
Backend/Bot/Program.cs Executable file
Просмотреть файл

@ -0,0 +1,38 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Logging;
namespace ContosoMaintenance.Bot
{
public class Program
{
public static void Main(string[] args)
{
BuildWebHost(args).Run();
}
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureLogging((hostingContext, logging) =>
{
// Add Azure Logging
logging.AddAzureWebAppDiagnostics();
// Logging Options.
// There are other logging options available:
// https://docs.microsoft.com/en-us/aspnet/core/fundamentals/logging/?view=aspnetcore-2.1
// logging.AddDebug();
// logging.AddConsole();
})
// Logging Options.
// Consider using Application Insights for your logging and metrics needs.
// https://azure.microsoft.com/en-us/services/application-insights/
// .UseApplicationInsights()
.UseStartup<Startup>()
.Build();
}
}

54
Backend/Bot/README.md Executable file
Просмотреть файл

@ -0,0 +1,54 @@
This sample demonstrates a simple echo bot with state with ASP.Net Core 2. The bot maintains a simple counter that increases with each message from the user.
# To try this sample
- Clone the samples repository
```bash
git clone https://github.com/Microsoft/botbuilder-samples.git
```
- [Optional] Update the `appsettings.json` file under `botbuilder-samples\samples\csharp_dotnetcore\02.echo-with-counter` with your botFileSecret. For Azure Bot Service bots, you can find the botFileSecret under application settings.
# Prerequisites
## Visual Studio
- Navigate to the samples folder (`botbuilder-samples\samples\csharp_dotnetcore\02.echo-with-counter`) and open EchoBotWithCounter.csproj in Visual Studio.
- Hit F5.
## Visual Studio Code
- Open `botbuilder-samples\samples\csharp_dotnetcore\02.echo-with-counter` sample folder.
- Bring up a terminal, navigate to `botbuilder-samples\samples\csharp_dotnetcore\02.echo-with-counter` folder.
- Type 'dotnet run'.
## Testing the bot using Bot Framework Emulator
[Microsoft Bot Framework Emulator](https://github.com/microsoft/botframework-emulator) is a desktop application that allows bot
developers to test and debug their bots on localhost or running remotely through a tunnel.
- Install the Bot Framework emulator from [here](https://aka.ms/botframeworkemulator).
## Connect to bot using Bot Framework Emulator **V4**
- Launch the Bot Framework Emulator.
- File -> Open bot and navigate to `botbuilder-samples\samples\csharp_dotnetcore\02.echo-with-counter` folder.
- Select `BotConfiguration.bot` file.
# Bot state
A key to good bot design is to track the context of a conversation, so that your bot remembers things like the answers to previous questions. Depending on what your bot is used for, you may even need to keep track of conversation state or store user related information for longer than the lifetime of one given conversation.
In this example, the bot's state is used to track number of messages.
A bot's state is information it remembers in order to respond appropriately to incoming messages. The Bot Builder SDK provides classes for [storing and retrieving state data](https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-howto-v4-state?view=azure-bot-service-4.0&tabs=js) as an object associated with a user or a conversation.
- Conversation properties help your bot keep track of the current conversation the bot is having with the user. If your bot needs to complete a sequence of steps or switch between conversation topics, you can use conversation properties to manage steps in a sequence or track the current topic. Since conversation properties reflect the state of the current conversation, you typically clear them at the end of a session, when the bot receives an end of conversation activity.
- User properties can be used for many purposes, such as determining where the user's prior conversation left off or simply greeting a returning user by name. If you store a user's preferences, you can use that information to customize the conversation the next time you chat. For example, you might alert the user to a news article about a topic that interests her, or alert a user when an appointment becomes available. You should clear them if the bot receives a delete user data activity.
# Deploy this bot to Azure
You can use the [MSBot](https://github.com/microsoft/botbuilder-tools) Bot Builder CLI tool to clone and configure any services this sample depends on.
To install all Bot Builder tools -
```bash
npm i -g msbot chatdown ludown qnamaker luis-apis botdispatch luisgen
```
To clone this bot, run
```
msbot clone services -f deploymentScripts/msbotClone -n <BOT-NAME> -l <Azure-location> --subscriptionId <Azure-subscription-id>
```
# Further reading
- [Azure Bot Service Introduction](https://docs.microsoft.com/en-us/azure/bot-service/bot-service-overview-introduction?view=azure-bot-service-4.0)
- [Bot State](https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-storage-concept?view=azure-bot-service-4.0)
- [Write directly to storage](https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-howto-v4-storage?view=azure-bot-service-4.0&tabs=jsechoproperty%2Ccsetagoverwrite%2Ccsetag)
- [Managing conversation and user state](https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-howto-v4-state?view=azure-bot-service-4.0&tabs=js)

151
Backend/Bot/Startup.cs Executable file
Просмотреть файл

@ -0,0 +1,151 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
using System;
using System.Linq;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Bot.Builder;
using Microsoft.Bot.Builder.Integration;
using Microsoft.Bot.Builder.Integration.AspNet.Core;
using Microsoft.Bot.Configuration;
using Microsoft.Bot.Connector.Authentication;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
namespace ContosoMaintenance.Bot
{
/// <summary>
/// The Startup class configures services and the request pipeline.
/// </summary>
public class Startup
{
private ILoggerFactory _loggerFactory;
private bool _isProduction = false;
public Startup(IHostingEnvironment env)
{
_isProduction = env.IsProduction();
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.AddEnvironmentVariables();
Configuration = builder.Build();
}
/// <summary>
/// Gets the configuration that represents a set of key/value application configuration properties.
/// </summary>
/// <value>
/// The <see cref="IConfiguration"/> that represents a set of key/value application configuration properties.
/// </value>
public IConfiguration Configuration { get; }
/// <summary>
/// This method gets called by the runtime. Use this method to add services to the container.
/// </summary>
/// <param name="services">The <see cref="IServiceCollection"/> specifies the contract for a collection of service descriptors.</param>
/// <seealso cref="IStatePropertyAccessor{T}"/>
/// <seealso cref="https://docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/dependency-injection"/>
/// <seealso cref="https://docs.microsoft.com/en-us/azure/bot-service/bot-service-manage-channels?view=azure-bot-service-4.0"/>
public void ConfigureServices(IServiceCollection services)
{
services.AddBot<EchoWithCounterBot>(options =>
{
var secretKey = Configuration.GetSection("botFileSecret")?.Value;
var botFilePath = Configuration.GetSection("botFilePath")?.Value;
// Loads .bot configuration file and adds a singleton that your Bot can access through dependency injection.
var botConfig = BotConfiguration.Load(botFilePath ?? @".\BotConfiguration.bot", secretKey);
services.AddSingleton(sp => botConfig ?? throw new InvalidOperationException($"The .bot config file could not be loaded. ({botConfig})"));
// Retrieve current endpoint.
var environment = _isProduction ? "production" : "development";
var service = botConfig.Services.Where(s => s.Type == "endpoint" && s.Name == environment).FirstOrDefault();
if (!(service is EndpointService endpointService))
{
throw new InvalidOperationException($"The .bot file does not contain an endpoint with name '{environment}'.");
}
options.CredentialProvider = new SimpleCredentialProvider(endpointService.AppId, endpointService.AppPassword);
// Creates a logger for the application to use.
ILogger logger = _loggerFactory.CreateLogger<EchoWithCounterBot>();
// Catches any errors that occur during a conversation turn and logs them.
options.OnTurnError = async (context, exception) =>
{
logger.LogError($"Exception caught : {exception}");
await context.SendActivityAsync("Sorry, it looks like something went wrong.");
};
// The Memory Storage used here is for local bot debugging only. When the bot
// is restarted, everything stored in memory will be gone.
IStorage dataStore = new MemoryStorage();
// For production bots use the Azure Blob or
// Azure CosmosDB storage providers. For the Azure
// based storage providers, add the Microsoft.Bot.Builder.Azure
// Nuget package to your solution. That package is found at:
// https://www.nuget.org/packages/Microsoft.Bot.Builder.Azure/
// Uncomment the following lines to use Azure Blob Storage
// //Storage configuration name or ID from the .bot file.
// const string StorageConfigurationId = "<STORAGE-NAME-OR-ID-FROM-BOT-FILE>";
// var blobConfig = botConfig.FindServiceByNameOrId(StorageConfigurationId);
// if (!(blobConfig is BlobStorageService blobStorageConfig))
// {
// throw new InvalidOperationException($"The .bot file does not contain an blob storage with name '{StorageConfigurationId}'.");
// }
// // Default container name.
// const string DefaultBotContainer = "<DEFAULT-CONTAINER>";
// var storageContainer = string.IsNullOrWhiteSpace(blobStorageConfig.Container) ? DefaultBotContainer : blobStorageConfig.Container;
// IStorage dataStore = new Microsoft.Bot.Builder.Azure.AzureBlobStorage(blobStorageConfig.ConnectionString, storageContainer);
// Create Conversation State object.
// The Conversation State object is where we persist anything at the conversation-scope.
var conversationState = new ConversationState(dataStore);
options.State.Add(conversationState);
});
// Create and register state accesssors.
// Acessors created here are passed into the IBot-derived class on every turn.
services.AddSingleton<EchoBotAccessors>(sp =>
{
var options = sp.GetRequiredService<IOptions<BotFrameworkOptions>>().Value;
if (options == null)
{
throw new InvalidOperationException("BotFrameworkOptions must be configured prior to setting up the state accessors");
}
var conversationState = options.State.OfType<ConversationState>().FirstOrDefault();
if (conversationState == null)
{
throw new InvalidOperationException("ConversationState must be defined and added before adding conversation-scoped state accessors.");
}
// Create the custom state accessor.
// State accessors enable other components to read and write individual properties of state.
var accessors = new EchoBotAccessors(conversationState)
{
CounterState = conversationState.CreateProperty<CounterState>(EchoBotAccessors.CounterStateName),
};
return accessors;
});
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
_loggerFactory = loggerFactory;
app.UseDefaultFiles()
.UseStaticFiles()
.UseBotFramework();
}
}
}

4
Backend/Bot/appsettings.json Executable file
Просмотреть файл

@ -0,0 +1,4 @@
{
"botFilePath": "BotConfiguration.bot",
"botFileSecret": ""
}

419
Backend/Bot/wwwroot/default.htm Executable file
Просмотреть файл

@ -0,0 +1,419 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Echo bot with counter sample</title>
<style>
body {
margin: 0px;
padding: 0px;
font-family: Segoe UI;
}
html,
body {
height: 100%;
}
header {
background-image: url("data:image/svg+xml,%3Csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 4638.9 651.6' style='enable-background:new 0 0 4638.9 651.6;' xml:space='preserve'%3E%3Cstyle type='text/css'%3E .st0%7Bfill:%2355A0E0;%7D .st1%7Bfill:none;%7D .st2%7Bfill:%230058A8;%7D .st3%7Bfill:%23328BD8;%7D .st4%7Bfill:%23B6DCF1;%7D .st5%7Bopacity:0.2;fill:url(%23SVGID_1_);enable-background:new ;%7D%0A%3C/style%3E%3Crect y='1.1' class='st0' width='4640' height='646.3'/%3E%3Cpath class='st1' d='M3987.8,323.6L4310.3,1.1h-65.6l-460.1,460.1c-17.5,17.5-46.1,17.5-63.6,0L3260.9,1.1H0v646.3h3660.3 L3889,418.7c17.5-17.5,46.1-17.5,63.6,0l228.7,228.7h66.6l-260.2-260.2C3970.3,369.8,3970.3,341.1,3987.8,323.6z'/%3E%3Cpath class='st2' d='M3784.6,461.2L4244.7,1.1h-983.9l460.1,460.1C3738.4,478.7,3767.1,478.7,3784.6,461.2z'/%3E%3Cpath class='st3' d='M4640,1.1h-329.8l-322.5,322.5c-17.5,17.5-17.5,46.1,0,63.6l260.2,260.2H4640L4640,1.1L4640,1.1z'/%3E%3Cpath class='st4' d='M3889,418.8l-228.7,228.7h521.1l-228.7-228.7C3935.2,401.3,3906.5,401.3,3889,418.8z'/%3E%3ClinearGradient id='SVGID_1_' gradientUnits='userSpaceOnUse' x1='3713.7576' y1='438.1175' x2='3911.4084' y2='14.2535' gradientTransform='matrix(1 0 0 -1 0 641.3969)'%3E%3Cstop offset='0' style='stop-color:%23FFFFFF;stop-opacity:0.5'/%3E%3Cstop offset='1' style='stop-color:%23FFFFFF'/%3E%3C/linearGradient%3E%3Cpath class='st5' d='M3952.7,124.5c-17.5-17.5-46.1-17.5-63.6,0l-523,523h1109.6L3952.7,124.5z'/%3E%3C/svg%3E%0A");
background-repeat: no-repeat;
background-size: 100%;
background-position: right;
background-color: #55A0E0;
width: 100%;
font-size: 44px;
height: 120px;
color: white;
padding: 30px 0 40px 0px;
display: inline-block;
}
.header-icon {
background-image: url("data:image/svg+xml;utf8,%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20xmlns%3Axlink%3D%22http%3A//www.w3.org/1999/xlink%22%20x%3D%220px%22%20y%3D%220px%22%0A%09%20viewBox%3D%220%200%20150.2%20125%22%20style%3D%22enable-background%3Anew%200%200%20150.2%20125%3B%22%20xml%3Aspace%3D%22preserve%22%3E%0A%3Cstyle%20type%3D%22text/css%22%3E%0A%09.st0%7Bfill%3Anone%3B%7D%0A%09.st1%7Bfill%3A%23FFFFFF%3B%7D%0A%3C/style%3E%0A%3Crect%20x%3D%220.5%22%20class%3D%22st0%22%20width%3D%22149.7%22%20height%3D%22125%22/%3E%0A%3Cg%3E%0A%09%3Cpath%20class%3D%22st1%22%20d%3D%22M59%2C102.9L21.8%2C66c-3.5-3.5-3.5-9.1%2C0-12.5l37-36.5l2.9%2C3l-37%2C36.4c-1.8%2C1.8-1.8%2C4.7%2C0%2C6.6l37.2%2C37L59%2C102.9z%22%0A%09%09/%3E%0A%3C/g%3E%0A%3Cg%3E%0A%09%3Cpath%20class%3D%22st1%22%20d%3D%22M92.5%2C102.9l-3-3l37.2-37c0.9-0.9%2C1.4-2%2C1.4-3.3c0-1.2-0.5-2.4-1.4-3.3L89.5%2C20l2.9-3l37.2%2C36.4%0A%09%09c1.7%2C1.7%2C2.6%2C3.9%2C2.6%2C6.3s-0.9%2C4.6-2.6%2C6.3L92.5%2C102.9z%22/%3E%0A%3C/g%3E%0A%3Cg%3E%0A%09%3Cpath%20class%3D%22st1%22%20d%3D%22M90.1%2C68.4c-4.5%2C0-8-3.5-8-8.1c0-4.5%2C3.5-8.1%2C8-8.1c4.4%2C0%2C8%2C3.7%2C8%2C8.1C98.1%2C64.7%2C94.4%2C68.4%2C90.1%2C68.4z%0A%09%09%20M90.1%2C56.5c-2.2%2C0-3.8%2C1.7-3.8%2C3.9c0%2C2.2%2C1.7%2C3.9%2C3.8%2C3.9c1.9%2C0%2C3.8-1.6%2C3.8-3.9S91.9%2C56.5%2C90.1%2C56.5z%22/%3E%0A%3C/g%3E%0A%3Cg%3E%0A%09%3Cpath%20class%3D%22st1%22%20d%3D%22M61.4%2C68.4c-4.5%2C0-8-3.5-8-8.1c0-4.5%2C3.5-8.1%2C8-8.1c4.4%2C0%2C8%2C3.7%2C8%2C8.1C69.5%2C64.7%2C65.8%2C68.4%2C61.4%2C68.4z%0A%09%09%20M61.4%2C56.5c-2.2%2C0-3.8%2C1.7-3.8%2C3.9c0%2C2.2%2C1.7%2C3.9%2C3.8%2C3.9c1.9%2C0%2C3.8-1.6%2C3.8-3.9S63.3%2C56.5%2C61.4%2C56.5z%22/%3E%0A%3C/g%3E%0A%3C/svg%3E%0A");
background-repeat: no-repeat;
float: left;
height: 140px;
width: 140px;
display: inline-block;
vertical-align: middle;
}
.header-text {
padding-left: 1%;
color: #FFFFFF;
font-family: "Segoe UI";
font-size: 72px;
font-weight: 300;
letter-spacing: 0.35px;
line-height: 96px;
display: inline-block;
vertical-align: middle;
}
.header-inner-container {
min-width: 480px;
max-width: 1366px;
margin-left: auto;
margin-right: auto;
vertical-align: middle;
}
.header-inner-container::after {
content: "";
clear: both;
display: table;
}
.main-content-area {
padding-left: 30px;
}
.content-title {
color: #000000;
font-family: "Segoe UI";
font-size: 46px;
font-weight: 300;
line-height: 62px;
}
.main-text {
color: #808080;
font-size: 24px;
font-family: "Segoe UI";
font-size: 24px;
font-weight: 200;
line-height: 32px;
}
.main-text-p1{
padding-top: 48px;
padding-bottom: 28px;
}
.endpoint {
height: 32px;
width: 571px;
color: #808080;
font-family: "Segoe UI";
font-size: 24px;
font-weight: 200;
line-height: 32px;
padding-top: 28px;
}
.how-to-build-section {
padding-top: 20px;
padding-left: 30px;
}
.how-to-build-section>h3 {
font-size: 16px;
font-weight: 600;
letter-spacing: 0.35px;
line-height: 22px;
margin: 0 0 24px 0;
text-transform: uppercase;
}
.step-container {
display: flex;
align-items: stretch;
position: relative;
}
.step-container dl {
border-left: 1px solid #A0A0A0;
display: block;
padding: 0 24px;
margin: 0;
}
.step-container dl>dt::before {
background-color: white;
border: 1px solid #A0A0A0;
border-radius: 100%;
content: '';
left: 47px;
height: 11px;
position: absolute;
width: 11px;
}
.step-container dl>.test-bullet::before {
background-color: blue;
}
.step-container dl>dt {
display: block;
font-size: inherit;
font-weight: bold;
line-height: 20px;
}
.step-container dl>dd {
font-size: inherit;
line-height: 20px;
margin-left: 0;
padding-bottom: 32px;
}
.step-container:last-child dl {
border-left: 1px solid transparent;
}
.ctaLink {
background-color: transparent;
border: 1px solid transparent;
color: #006AB1;
cursor: pointer;
font-weight: 600;
padding: 0;
white-space: normal;
}
.ctaLink:focus {
outline: 1px solid #00bcf2;
}
.ctaLink:hover {
text-decoration: underline;
}
.step-icon {
display: flex;
height: 38px;
margin-right: 15px;
width: 38px;
}
.step-icon>div {
height: 30px;
width: 30px;
background-repeat: no-repeat;
}
.ms-logo-container {
min-width: 580px;
max-width: 980px;
margin-left: auto;
margin-right: auto;
left: 0;
right: 0;
transition: bottom 400ms;
}
.ms-logo {
float: right;
background-image: url("data:image/svg+xml;utf8,%0A%3Csvg%20version%3D%221.1%22%20id%3D%22MS-symbol%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20xmlns%3Axlink%3D%22http%3A//www.w3.org/1999/xlink%22%20x%3D%220px%22%20y%3D%220px%22%0A%09%20viewBox%3D%220%200%20400%20120%22%20style%3D%22enable-background%3Anew%200%200%20400%20120%3B%22%20xml%3Aspace%3D%22preserve%22%3E%0A%3Cstyle%20type%3D%22text/css%22%3E%0A%09.st0%7Bfill%3Anone%3B%7D%0A%09.st1%7Bfill%3A%23737474%3B%7D%0A%09.st2%7Bfill%3A%23D63F26%3B%7D%0A%09.st3%7Bfill%3A%23167D3E%3B%7D%0A%09.st4%7Bfill%3A%232E76BC%3B%7D%0A%09.st5%7Bfill%3A%23FDB813%3B%7D%0A%3C/style%3E%0A%3Crect%20x%3D%220.6%22%20class%3D%22st0%22%20width%3D%22398.7%22%20height%3D%22119%22/%3E%0A%3Cpath%20class%3D%22st1%22%20d%3D%22M171.3%2C38.4v43.2h-7.5V47.7h-0.1l-13.4%2C33.9h-5l-13.7-33.9h-0.1v33.9h-6.9V38.4h10.8l12.4%2C32h0.2l13.1-32H171.3%0A%09z%20M177.6%2C41.7c0-1.2%2C0.4-2.2%2C1.3-3c0.9-0.8%2C1.9-1.2%2C3.1-1.2c1.3%2C0%2C2.4%2C0.4%2C3.2%2C1.3c0.8%2C0.8%2C1.3%2C1.8%2C1.3%2C3c0%2C1.2-0.4%2C2.2-1.3%2C3%0A%09c-0.9%2C0.8-1.9%2C1.2-3.2%2C1.2s-2.3-0.4-3.1-1.2C178%2C43.8%2C177.6%2C42.8%2C177.6%2C41.7z%20M185.7%2C50.6v31h-7.3v-31H185.7z%20M207.8%2C76.3%0A%09c1.1%2C0%2C2.3-0.3%2C3.6-0.8c1.3-0.5%2C2.5-1.2%2C3.6-2v6.8c-1.2%2C0.7-2.5%2C1.2-4%2C1.5c-1.5%2C0.3-3.1%2C0.5-4.9%2C0.5c-4.6%2C0-8.3-1.4-11.1-4.3%0A%09c-2.9-2.9-4.3-6.6-4.3-11c0-5%2C1.5-9.1%2C4.4-12.3c2.9-3.2%2C7-4.8%2C12.4-4.8c1.4%2C0%2C2.7%2C0.2%2C4.1%2C0.5c1.4%2C0.4%2C2.5%2C0.8%2C3.3%2C1.2v7%0A%09c-1.1-0.8-2.3-1.5-3.4-1.9c-1.2-0.5-2.4-0.7-3.6-0.7c-2.9%2C0-5.2%2C0.9-7%2C2.8c-1.8%2C1.9-2.7%2C4.4-2.7%2C7.6c0%2C3.1%2C0.8%2C5.6%2C2.5%2C7.3%0A%09C202.6%2C75.4%2C204.9%2C76.3%2C207.8%2C76.3z%20M235.7%2C50.1c0.6%2C0%2C1.1%2C0%2C1.6%2C0.1s0.9%2C0.2%2C1.2%2C0.3v7.4c-0.4-0.3-0.9-0.5-1.7-0.8%0A%09c-0.7-0.3-1.6-0.4-2.7-0.4c-1.8%2C0-3.3%2C0.8-4.5%2C2.3c-1.2%2C1.5-1.9%2C3.8-1.9%2C7v15.6h-7.3v-31h7.3v4.9h0.1c0.7-1.7%2C1.7-3%2C3-4%0A%09C232.2%2C50.6%2C233.8%2C50.1%2C235.7%2C50.1z%20M238.9%2C66.6c0-5.1%2C1.4-9.2%2C4.3-12.2c2.9-3%2C6.9-4.5%2C12.1-4.5c4.8%2C0%2C8.6%2C1.4%2C11.3%2C4.3%0A%09c2.7%2C2.9%2C4.1%2C6.8%2C4.1%2C11.7c0%2C5-1.4%2C9-4.3%2C12c-2.9%2C3-6.8%2C4.5-11.8%2C4.5c-4.8%2C0-8.6-1.4-11.4-4.2C240.3%2C75.3%2C238.9%2C71.4%2C238.9%2C66.6z%0A%09%20M246.5%2C66.3c0%2C3.2%2C0.7%2C5.7%2C2.2%2C7.4c1.5%2C1.7%2C3.6%2C2.6%2C6.3%2C2.6c2.7%2C0%2C4.7-0.9%2C6.1-2.6c1.4-1.7%2C2.1-4.2%2C2.1-7.6c0-3.3-0.7-5.8-2.2-7.5%0A%09c-1.4-1.7-3.4-2.5-6-2.5c-2.7%2C0-4.7%2C0.9-6.2%2C2.7C247.2%2C60.5%2C246.5%2C63%2C246.5%2C66.3z%20M281.5%2C58.8c0%2C1%2C0.3%2C1.9%2C1%2C2.5%0A%09c0.7%2C0.6%2C2.1%2C1.3%2C4.4%2C2.2c2.9%2C1.2%2C5%2C2.5%2C6.1%2C3.9c1.2%2C1.5%2C1.8%2C3.2%2C1.8%2C5.3c0%2C2.9-1.1%2C5.3-3.4%2C7c-2.2%2C1.8-5.3%2C2.7-9.1%2C2.7%0A%09c-1.3%2C0-2.7-0.2-4.3-0.5c-1.6-0.3-2.9-0.7-4-1.2v-7.2c1.3%2C0.9%2C2.8%2C1.7%2C4.3%2C2.2c1.5%2C0.5%2C2.9%2C0.8%2C4.2%2C0.8c1.6%2C0%2C2.9-0.2%2C3.6-0.7%0A%09c0.8-0.5%2C1.2-1.2%2C1.2-2.3c0-1-0.4-1.9-1.2-2.5c-0.8-0.7-2.4-1.5-4.6-2.4c-2.7-1.1-4.6-2.4-5.7-3.8c-1.1-1.4-1.7-3.2-1.7-5.4%0A%09c0-2.8%2C1.1-5.1%2C3.3-6.9c2.2-1.8%2C5.1-2.7%2C8.6-2.7c1.1%2C0%2C2.3%2C0.1%2C3.6%2C0.4c1.3%2C0.2%2C2.5%2C0.6%2C3.4%2C0.9v6.9c-1-0.6-2.1-1.2-3.4-1.7%0A%09c-1.3-0.5-2.6-0.7-3.8-0.7c-1.4%2C0-2.5%2C0.3-3.2%2C0.8C281.9%2C57.1%2C281.5%2C57.8%2C281.5%2C58.8z%20M297.9%2C66.6c0-5.1%2C1.4-9.2%2C4.3-12.2%0A%09c2.9-3%2C6.9-4.5%2C12.1-4.5c4.8%2C0%2C8.6%2C1.4%2C11.3%2C4.3c2.7%2C2.9%2C4.1%2C6.8%2C4.1%2C11.7c0%2C5-1.4%2C9-4.3%2C12c-2.9%2C3-6.8%2C4.5-11.8%2C4.5%0A%09c-4.8%2C0-8.6-1.4-11.4-4.2C299.4%2C75.3%2C297.9%2C71.4%2C297.9%2C66.6z%20M305.5%2C66.3c0%2C3.2%2C0.7%2C5.7%2C2.2%2C7.4c1.5%2C1.7%2C3.6%2C2.6%2C6.3%2C2.6%0A%09c2.7%2C0%2C4.7-0.9%2C6.1-2.6c1.4-1.7%2C2.1-4.2%2C2.1-7.6c0-3.3-0.7-5.8-2.2-7.5c-1.4-1.7-3.4-2.5-6-2.5c-2.7%2C0-4.7%2C0.9-6.2%2C2.7%0A%09C306.3%2C60.5%2C305.5%2C63%2C305.5%2C66.3z%20M353.9%2C56.6h-10.9v25h-7.4v-25h-5.2v-6h5.2v-4.3c0-3.3%2C1.1-5.9%2C3.2-8c2.1-2.1%2C4.8-3.1%2C8.1-3.1%0A%09c0.9%2C0%2C1.7%2C0%2C2.4%2C0.1c0.7%2C0.1%2C1.3%2C0.2%2C1.8%2C0.4V42c-0.2-0.1-0.7-0.3-1.3-0.5c-0.6-0.2-1.3-0.3-2.1-0.3c-1.5%2C0-2.7%2C0.5-3.5%2C1.4%0A%09s-1.2%2C2.4-1.2%2C4.2v3.7h10.9v-7l7.3-2.2v9.2h7.4v6h-7.4v14.5c0%2C1.9%2C0.3%2C3.3%2C1%2C4c0.7%2C0.8%2C1.8%2C1.2%2C3.3%2C1.2c0.4%2C0%2C0.9-0.1%2C1.5-0.3%0A%09c0.6-0.2%2C1.1-0.4%2C1.6-0.7v6c-0.5%2C0.3-1.2%2C0.5-2.3%2C0.7c-1.1%2C0.2-2.1%2C0.3-3.2%2C0.3c-3.1%2C0-5.4-0.8-6.9-2.5c-1.5-1.6-2.3-4.1-2.3-7.4%0A%09V56.6z%22/%3E%0A%3Cg%3E%0A%09%3Crect%20x%3D%2231%22%20y%3D%2224%22%20class%3D%22st2%22%20width%3D%2234.2%22%20height%3D%2234.2%22/%3E%0A%09%3Crect%20x%3D%2268.8%22%20y%3D%2224%22%20class%3D%22st3%22%20width%3D%2234.2%22%20height%3D%2234.2%22/%3E%0A%09%3Crect%20x%3D%2231%22%20y%3D%2261.8%22%20class%3D%22st4%22%20width%3D%2234.2%22%20height%3D%2234.2%22/%3E%0A%09%3Crect%20x%3D%2268.8%22%20y%3D%2261.8%22%20class%3D%22st5%22%20width%3D%2234.2%22%20height%3D%2234.2%22/%3E%0A%3C/g%3E%0A%3C/svg%3E%0A");
}
.ms-logo-container>div {
min-height: 60px;
width: 150px;
background-repeat: no-repeat;
}
.row {
padding: 90px 0px 0 20px;
min-width: 480px;
max-width: 1366px;
margin-left: auto;
margin-right: auto;
}
.column {
float: left;
width: 45%;
padding-right: 20px;
}
.row:after {
content: "";
display: table;
clear: both;
}
a {
text-decoration: none;
}
.download-the-emulator {
height: 20px;
color: #0063B1;
font-size: 15px;
line-height: 20px;
padding-bottom: 70px;
}
.how-to-iframe {
max-width: 700px !important;
min-width: 650px !important;
height: 700px !important;
}
.remove-frame-height {
height: 10px;
}
@media only screen and (max-width: 1300px) {
.ms-logo {
padding-top: 30px;
}
.header-text {
font-size: 40x;
}
.column {
float: none;
padding-top: 30px;
width: 100%;
}
.ms-logo-container {
padding-top: 30px;
min-width: 480px;
max-width: 650px;
margin-left: auto;
margin-right: auto;
}
.row {
padding: 20px 0px 0 20px;
min-width: 480px;
max-width: 650px;
margin-left: auto;
margin-right: auto;
}
}
@media only screen and (max-width: 1370px) {
header {
background-color: #55A0E0;
background-size: auto 200px;
}
}
@media only screen and (max-width: 1230px) {
header {
background-color: #55A0E0;
background-size: auto 200px;
}
.header-text {
font-size: 44px;
}
.header-icon {
height: 120px;
width: 120px;
}
}
@media only screen and (max-width: 1000px) {
header {
background-color: #55A0E0;
background-image: none;
}
}
@media only screen and (max-width: 632px) {
.header-text {
font-size: 32px;
}
.row {
padding: 10px 0px 0 10px;
max-width: 490px !important;
min-width: 410px !important;
}
.endpoint {
font-size: 25px;
}
.main-text {
font-size: 20px;
}
.step-container dl>dd {
font-size: 14px;
}
.column {
padding-right: 5px;
}
.header-icon {
height: 110px;
width: 110px;
}
.how-to-iframe {
max-width: 480px !important;
min-width: 400px !important;
height: 650px !important;
overflow: hidden;
}
}
.remove-frame-height {
max-height: 10px;
}
</style>
<script>
document.addEventListener('DOMContentLoaded', function () {
loadFrame();
});
var loadFrame = function () {
var iframe = document.createElement('iframe');
iframe.setAttribute("id", "iframe");
var offLineHTMLContent = "";
var frameElement = document.getElementById("how-to-iframe");
if (window.navigator.onLine) {
iframe.src = 'https://docs.botframework.com/static/abs/pages/f5.htm';
iframe.setAttribute("scrolling", "no");
iframe.setAttribute("frameborder", "0");
iframe.setAttribute("width", "100%");
iframe.setAttribute("height", "100%");
var frameDiv = document.getElementById("how-to-iframe");
frameDiv.appendChild(iframe);
} else {
frameElement.classList.add("remove-frame-height");
}
};
</script>
</head>
<body>
<header class="header">
<div class="header-inner-container">
<div class="header-icon" style="display: inline-block"></div>
<div class="header-text" style="display: inline-block">Echo with Counter Bot</div>
</div>
</header>
<div class="row">
<div class="column" class="main-content-area">
<div class="content-title">Your bot is ready!</div>
<div class="main-text main-text-p1">You can test your bot in the Bot Framework Emulator<br />
by opening the .bot file in the project folder.</div>
<div class="main-text download-the-emulator"><a class="ctaLink" href="https://aka.ms/bot-framework-F5-download-emulator"
target="_blank">Download the Emulator</a></div>
<div class="main-text">Visit <a class="ctaLink" href="https://aka.ms/bot-framework-F5-abs-home" target="_blank">Azure
Bot Service</a> to register your bot and add it to<br />
various channels. The bot's endpoint URL typically looks
like this:</div>
<div class="endpoint">https://<i>your_bots_hostname</i>/api/messages</div>
</div>
<div class="column how-to-iframe" id="how-to-iframe"></div>
</div>
</div>
<div class="ms-logo-container">
<div class="ms-logo"></div>
</div>
</body>
</html>

Просмотреть файл

@ -1,21 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp2.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<Folder Include="Dialogs\" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.5" />
<PackageReference Include="Microsoft.Bot.Connector.AspNetCore" Version="2.0.0.8" />
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="2.0.2" />
</ItemGroup>
<ItemGroup>
<DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.2" />
</ItemGroup>
</Project>

Просмотреть файл

@ -1,74 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Bot.Connector;
using Microsoft.Extensions.Configuration;
namespace ContosoMaintenance.Bot.WebApp.Core.Controllers
{
[Produces("application/json")]
[Route("api/Messages")]
public class MessagesController : Controller
{
//private IConfiguration configuration;
private MicrosoftAppCredentials appCredentials;
public MessagesController(IConfiguration configuration)
{
//this.configuration = configuration;
appCredentials = new MicrosoftAppCredentials(configuration);
}
[Authorize(Roles = "Bot")]
[HttpPost]
public async Task<OkResult> Post([FromBody] Activity activity)
{
if (activity.GetActivityType() == ActivityTypes.Message)
{
var connector = new ConnectorClient(new Uri(activity.ServiceUrl), appCredentials);
//connector.Conversations.SendToConversationAsync(activity, () => new BasicLuisDialog());
//await Conversation.SendAsync(activity, () => new BasicLuisDialog());
// return our reply to the user
var reply = activity.CreateReply("HelloWorld");
await connector.Conversations.ReplyToActivityAsync(reply);
}
else
{
HandleSystemMessage(activity);
}
return Ok();
}
private Activity HandleSystemMessage(Activity message)
{
if (message.Type == ActivityTypes.DeleteUserData)
{
// Implement user deletion here
// If we handle user deletion, return a real message
}
else if (message.Type == ActivityTypes.ConversationUpdate)
{
// Handle conversation state changes, like members being added and removed
// Use Activity.MembersAdded and Activity.MembersRemoved and Activity.Action for info
// Not available in all channels
}
else if (message.Type == ActivityTypes.ContactRelationUpdate)
{
// Handle add/remove from contact lists
// Activity.From + Activity.Action represent what happened
}
else if (message.Type == ActivityTypes.Typing)
{
// Handle knowing tha the user is typing
}
else if (message.Type == ActivityTypes.Ping)
{
}
return null;
}
}
}

Просмотреть файл

@ -1,44 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
namespace ContosoMaintenance.Bot.WebApp.Core.Controllers
{
[Route("api/[controller]")]
public class ValuesController : Controller
{
// GET api/values
[HttpGet]
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
// GET api/values/5
[HttpGet("{id}")]
public string Get(int id)
{
return "value";
}
// POST api/values
[HttpPost]
public void Post([FromBody]string value)
{
}
// PUT api/values/5
[HttpPut("{id}")]
public void Put(int id, [FromBody]string value)
{
}
// DELETE api/values/5
[HttpDelete("{id}")]
public void Delete(int id)
{
}
}
}

Просмотреть файл

@ -1,25 +0,0 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
namespace ContosoMaintenance.Bot.WebApp.Core
{
public class Program
{
public static void Main(string[] args)
{
BuildWebHost(args).Run();
}
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.Build();
}
}

Просмотреть файл

@ -1,54 +0,0 @@
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Threading.Tasks;
namespace ContosoMaintenance.Bot.WebApp.Core.Services
{
[Serializable]
public class AzureSearchService
{
private static readonly string QueryString = $"https://{WebConfigurationManager.AppSettings["SearchName"]}.search.windows.net/indexes/{WebConfigurationManager.AppSettings["IndexName"]}/docs?api-key={WebConfigurationManager.AppSettings["SearchKey"]}&api-version=2016-09-01&";
public async Task<FacetResult> FetchFacets()
{
using (var httpClient = new HttpClient())
{
string facetQuey = $"{QueryString}facet=Category";
string response = await httpClient.GetStringAsync(facetQuey);
return JsonConvert.DeserializeObject<FacetResult>(response);
}
}
public async Task<SearchResult> Search(string value)
{
if (string.IsNullOrEmpty(value))
throw new ArgumentNullException("Cannot search with a null value");
using (var httpClient = new HttpClient())
{
string parsedSearch = WebUtility.UrlEncode(value);
string query = $"{QueryString}search='{parsedSearch}'";
string response = await httpClient.GetStringAsync(query);
return JsonConvert.DeserializeObject<SearchResult>(response);
}
}
public async Task<SearchResult> FilterByStatus(string value)
{
if (string.IsNullOrEmpty(value))
throw new ArgumentNullException("Cannot search with a null value");
using (var httpClient = new HttpClient())
{
string parsedStatus = WebUtility.UrlEncode(value.Replace(" ", "+"));
//$filter=status eq 'Waiting'
string query = $"{QueryString}$filter=status eq '{value}'";
string response = await httpClient.GetStringAsync(query);
return JsonConvert.DeserializeObject<SearchResult>(response);
}
}
}
}

Просмотреть файл

@ -1,65 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Bot.Connector;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
namespace ContosoMaintenance.Bot.WebApp.Core
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton(_ => Configuration);
var credentialProvider = new StaticCredentialProvider(
Configuration.GetSection(MicrosoftAppCredentials.MicrosoftAppIdKey)?.Value,
Configuration.GetSection(MicrosoftAppCredentials.MicrosoftAppPasswordKey)?.Value);
services.AddAuthentication(
// This can be removed after https://github.com/aspnet/IISIntegration/issues/371
options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}
)
.AddBotAuthentication(credentialProvider);
services.AddSingleton(typeof(ICredentialProvider), credentialProvider);
services.AddMvc(options =>
{
options.Filters.Add(typeof(TrustServiceUrlAttribute));
});
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseStaticFiles();
app.UseAuthentication();
app.UseMvc();
}
}
}

Просмотреть файл

@ -1,10 +0,0 @@
{
"Logging": {
"IncludeScopes": false,
"LogLevel": {
"Default": "Debug",
"System": "Information",
"Microsoft": "Information"
}
}
}

Просмотреть файл

@ -1,25 +0,0 @@
{
"Logging": {
"IncludeScopes": false,
"Debug": {
"LogLevel": {
"Default": "Warning"
}
},
"Console": {
"LogLevel": {
"Default": "Warning"
}
}
},
"MicrosoftAppId": "616266b2-fe17-41b7-b720-9399b4b7ed4b",
"MicrosoftAppPassword": "WQF:1M5Lm-9w1V3D",
"SearchName": "",
"IndexName": "",
"SearchKey": "",
"LuisAppId": "",
"LuisAPIKey": "",
"LuisAPIHostName": "",
"AzureWebJobsStorage": "",
"BotCardsBlobStorageURL": ""
}

Просмотреть файл

@ -1,21 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<title>Contoso Chat Bot</title>
<meta charset="utf-8" />
</head>
<body style="font-family:'Segoe UI'">
<h1>Contoso Luis Bot</h1>
<p>A bot that shows how to handle natural language using the Cognitive Services LUIS API with Azure Search to look for Jobs. </p>
<p>Here are some handy links to get started:</p>
<p>
<ul>
<li><a href="https://docs.microsoft.com/en-us/bot-framework/dotnet/bot-builder-dotnet-overview">Get started building bots with .NET.</a></li>
<li><a href="https://docs.microsoft.com/en-us/bot-framework/cognitive-services-bot-intelligence-overview#language-understanding">Learn more about LUIS and the Cognitive Services.</a></li>
<li><a href="https://www.luis.ai">Visit the LUIS portal.</a></li>
<li><a href="https://docs.microsoft.com/en-us/bot-framework/azure/azure-bot-service-continuous-deployment#set-up-continuous-deployment">Get the bot code and setup continuous deployment.</a></li>
<li><a href="https://docs.microsoft.com/en-us/bot-framework/debug-bots-emulator">Debug your bot.</a></li>
</ul>
</p>
</body>
</html>

Просмотреть файл

@ -1,2 +0,0 @@
[config]
command = deploy.cmd

6
Backend/BotBackend/.gitignore поставляемый
Просмотреть файл

@ -1,6 +0,0 @@
obj/
bin/
packages/
*.pubxml.user
*.csproj.user
.vs/

Просмотреть файл

@ -1,37 +0,0 @@
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
namespace SimpleEchoBot
{
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Json settings
config.Formatters.JsonFormatter.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
config.Formatters.JsonFormatter.SerializerSettings.Formatting = Formatting.Indented;
JsonConvert.DefaultSettings = () => new JsonSerializerSettings()
{
ContractResolver = new CamelCasePropertyNamesContractResolver(),
Formatting = Newtonsoft.Json.Formatting.Indented,
NullValueHandling = NullValueHandling.Ignore,
};
// Web API configuration and services
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
}

Просмотреть файл

@ -1,258 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(SolutionDir)\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.1\build\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props" Condition="Exists('$(SolutionDir)\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.1\build\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props')" />
<Import Project="$(SolutionDir)\packages\Microsoft.Net.Compilers.1.2.1\build\Microsoft.Net.Compilers.props" Condition="Exists('$(SolutionDir)\packages\Microsoft.Net.Compilers.1.2.1\build\Microsoft.Net.Compilers.props')" />
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>
</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{9C7E3A46-B60F-4052-9A21-DC8D1A942216}</ProjectGuid>
<ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>LuisBot</RootNamespace>
<AssemblyName>LuisBot</AssemblyName>
<TargetFrameworkVersion>v4.6</TargetFrameworkVersion>
<UseIISExpress>true</UseIISExpress>
<IISExpressSSLPort />
<IISExpressAnonymousAuthentication />
<IISExpressWindowsAuthentication />
<IISExpressUseClassicPipelineMode />
<UseGlobalApplicationHostFile />
<NuGetPackageImportStamp>
</NuGetPackageImportStamp>
<TargetFrameworkProfile />
<Use64BitIISExpress />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<NoWarn>CS1998</NoWarn>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<NoWarn>CS1998</NoWarn>
</PropertyGroup>
<ItemGroup>
<Reference Include="AdaptiveCards, Version=0.5.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>$(SolutionDir)\packages\Microsoft.AdaptiveCards.0.5.1\lib\net452\AdaptiveCards.dll</HintPath>
</Reference>
<Reference Include="Autofac, Version=3.5.0.0, Culture=neutral, PublicKeyToken=17863af14b0044da, processorArchitecture=MSIL">
<HintPath>$(SolutionDir)\packages\Autofac.3.5.2\lib\net40\Autofac.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Chronic, Version=0.3.2.0, Culture=neutral, PublicKeyToken=3bd1f1ef638b0d3c, processorArchitecture=MSIL">
<HintPath>$(SolutionDir)\packages\Chronic.Signed.0.3.2\lib\net40\Chronic.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
<HintPath>$(SolutionDir)\packages\EntityFramework.6.1.3\lib\net45\EntityFramework.dll</HintPath>
</Reference>
<Reference Include="EntityFramework.SqlServer, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
<HintPath>$(SolutionDir)\packages\EntityFramework.6.1.3\lib\net45\EntityFramework.SqlServer.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Azure.Documents.Client, Version=1.11.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>$(SolutionDir)\packages\Microsoft.Azure.DocumentDB.1.11.0\lib\net45\Microsoft.Azure.Documents.Client.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Microsoft.Azure.KeyVault.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>$(SolutionDir)\packages\Microsoft.Azure.KeyVault.Core.1.0.0\lib\net40\Microsoft.Azure.KeyVault.Core.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Microsoft.Bot.Builder, Version=3.13.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\..\packages\Microsoft.Bot.Builder.3.13.1\lib\net46\Microsoft.Bot.Builder.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Bot.Builder.Autofac, Version=3.13.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\..\packages\Microsoft.Bot.Builder.3.13.1\lib\net46\Microsoft.Bot.Builder.Autofac.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Bot.Builder.Azure, Version=3.2.5.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>$(SolutionDir)\packages\Microsoft.Bot.Builder.Azure.3.2.5\lib\net46\Microsoft.Bot.Builder.Azure.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Bot.Builder.History, Version=3.13.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\..\packages\Microsoft.Bot.Builder.History.3.13.1\lib\net46\Microsoft.Bot.Builder.History.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Bot.Connector, Version=3.13.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\..\packages\Microsoft.Bot.Connector.3.13.1\lib\net46\Microsoft.Bot.Connector.dll</HintPath>
</Reference>
<Reference Include="Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>$(SolutionDir)\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.1\lib\net45\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Microsoft.CSharp" />
<Reference Include="Microsoft.Data.Edm, Version=5.6.4.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>$(SolutionDir)\packages\Microsoft.Data.Edm.5.6.4\lib\net40\Microsoft.Data.Edm.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Microsoft.Data.OData, Version=5.6.4.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>$(SolutionDir)\packages\Microsoft.Data.OData.5.6.4\lib\net40\Microsoft.Data.OData.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Microsoft.Data.Services.Client, Version=5.6.4.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>$(SolutionDir)\packages\Microsoft.Data.Services.Client.5.6.4\lib\net40\Microsoft.Data.Services.Client.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Microsoft.IdentityModel.Logging, Version=1.1.4.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>$(SolutionDir)\packages\Microsoft.IdentityModel.Logging.1.1.4\lib\net451\Microsoft.IdentityModel.Logging.dll</HintPath>
</Reference>
<Reference Include="Microsoft.IdentityModel.Protocol.Extensions, Version=1.0.40306.1554, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>$(SolutionDir)\packages\Microsoft.IdentityModel.Protocol.Extensions.1.0.4.403061554\lib\net45\Microsoft.IdentityModel.Protocol.Extensions.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Microsoft.IdentityModel.Protocols, Version=2.1.4.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>$(SolutionDir)\packages\Microsoft.IdentityModel.Protocols.2.1.4\lib\net451\Microsoft.IdentityModel.Protocols.dll</HintPath>
</Reference>
<Reference Include="Microsoft.IdentityModel.Protocols.OpenIdConnect, Version=2.1.4.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>$(SolutionDir)\packages\Microsoft.IdentityModel.Protocols.OpenIdConnect.2.1.4\lib\net451\Microsoft.IdentityModel.Protocols.OpenIdConnect.dll</HintPath>
</Reference>
<Reference Include="Microsoft.IdentityModel.Tokens, Version=5.1.4.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>$(SolutionDir)\packages\Microsoft.IdentityModel.Tokens.5.1.4\lib\net451\Microsoft.IdentityModel.Tokens.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Rest.ClientRuntime, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>$(SolutionDir)\packages\Microsoft.Rest.ClientRuntime.2.3.2\lib\net45\Microsoft.Rest.ClientRuntime.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Microsoft.WindowsAzure.Configuration, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>$(SolutionDir)\packages\Microsoft.WindowsAzure.ConfigurationManager.3.2.1\lib\net40\Microsoft.WindowsAzure.Configuration.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Microsoft.WindowsAzure.Storage, Version=7.2.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>$(SolutionDir)\packages\WindowsAzure.Storage.7.2.1\lib\net40\Microsoft.WindowsAzure.Storage.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Newtonsoft.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>$(SolutionDir)\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="System.IdentityModel.Tokens.Jwt, Version=5.1.4.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>$(SolutionDir)\packages\System.IdentityModel.Tokens.Jwt.5.1.4\lib\net451\System.IdentityModel.Tokens.Jwt.dll</HintPath>
</Reference>
<Reference Include="System.Net" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Net.Http.Formatting, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>$(SolutionDir)\packages\Microsoft.AspNet.WebApi.Client.5.2.3\lib\net45\System.Net.Http.Formatting.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="System.Net.Http.WebRequest" />
<Reference Include="System.Runtime.Serialization" />
<Reference Include="System.Spatial, Version=5.6.4.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>$(SolutionDir)\packages\System.Spatial.5.6.4\lib\net40\System.Spatial.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="System.Web.DynamicData" />
<Reference Include="System.Web.Entity" />
<Reference Include="System.Web.ApplicationServices" />
<Reference Include="System.ComponentModel.DataAnnotations" />
<Reference Include="System" />
<Reference Include="System.Data" />
<Reference Include="System.Web.Extensions" />
<Reference Include="System.Drawing" />
<Reference Include="System.Web" />
<Reference Include="System.Web.Http, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>$(SolutionDir)\packages\Microsoft.AspNet.WebApi.Core.5.2.3\lib\net45\System.Web.Http.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="System.Web.Http.WebHost, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>$(SolutionDir)\packages\Microsoft.AspNet.WebApi.WebHost.5.2.3\lib\net45\System.Web.Http.WebHost.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="System.Xml" />
<Reference Include="System.Configuration" />
<Reference Include="System.Web.Services" />
<Reference Include="System.EnterpriseServices" />
<Reference Include="System.Xml.Linq" />
</ItemGroup>
<ItemGroup>
<Content Include="default.htm" />
<Content Include="Global.asax" />
<Content Include="Web.config">
<SubType>Designer</SubType>
</Content>
</ItemGroup>
<ItemGroup>
<Compile Include="App_Start\WebApiConfig.cs" />
<Compile Include="Definitions\ServiceEntities.cs" />
<Compile Include="Dialogs\BasicLuisDialog.cs" />
<Compile Include="Controllers\MessagesController.cs" />
<Compile Include="Dialogs\SearchServiceDialog.cs" />
<Compile Include="Global.asax.cs">
<DependentUpon>Global.asax</DependentUpon>
</Compile>
<Compile Include="Models\JobModel.cs" />
<Compile Include="Models\SearchResultModel.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Services\AzureSearchService.cs" />
<Compile Include="Utils\CardUtil.cs" />
<Compile Include="Utils\JobModelExtension.cs" />
</ItemGroup>
<ItemGroup>
<Content Include="packages.config" />
<None Include="Properties\PublishProfiles\contosomaintenance-bot - FTP.pubxml" />
<None Include="Properties\PublishProfiles\contosomaintenance-bot - Web Deploy.pubxml" />
<None Include="Web.Debug.config">
<DependentUpon>Web.config</DependentUpon>
</None>
<None Include="Web.Release.config">
<DependentUpon>Web.config</DependentUpon>
</None>
</ItemGroup>
<ItemGroup />
<PropertyGroup>
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
</PropertyGroup>
<PropertyGroup>
<EnableMSDeployAppOffline>true</EnableMSDeployAppOffline>
</PropertyGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<Import Project="$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets" Condition="'$(VSToolsPath)' != ''" />
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" Condition="false" />
<ProjectExtensions>
<VisualStudio>
<FlavorProperties GUID="{349c5851-65df-11da-9384-00065b846f21}">
<WebProjectProperties>
<UseIIS>True</UseIIS>
<AutoAssignPort>True</AutoAssignPort>
<DevelopmentServerPort>3978</DevelopmentServerPort>
<DevelopmentServerVPath>/</DevelopmentServerVPath>
<IISUrl>http://localhost:3984/</IISUrl>
<NTLMAuthentication>False</NTLMAuthentication>
<UseCustomServer>False</UseCustomServer>
<CustomServerUrl>
</CustomServerUrl>
<SaveServerSettingsInUserFile>False</SaveServerSettingsInUserFile>
</WebProjectProperties>
</FlavorProperties>
</VisualStudio>
</ProjectExtensions>
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('$(SolutionDir)\packages\Microsoft.Net.Compilers.1.2.1\build\Microsoft.Net.Compilers.props')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\packages\Microsoft.Net.Compilers.1.2.1\build\Microsoft.Net.Compilers.props'))" />
<Error Condition="!Exists('$(SolutionDir)\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.1\build\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.1\build\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props'))" />
<Error Condition="!Exists('$(SolutionDir)\packages\Microsoft.Azure.DocumentDB.1.11.0\build\Microsoft.Azure.DocumentDB.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\packages\Microsoft.Azure.DocumentDB.1.11.0\build\Microsoft.Azure.DocumentDB.targets'))" />
</Target>
<Import Project="$(SolutionDir)\packages\Microsoft.Azure.DocumentDB.1.11.0\build\Microsoft.Azure.DocumentDB.targets" Condition="Exists('$(SolutionDir)\packages\Microsoft.Azure.DocumentDB.1.11.0\build\Microsoft.Azure.DocumentDB.targets')" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
<Import Project="PostDeployScripts\IncludeSources.targets" Condition="Exists('PostDeployScripts\IncludeSources.targets')" />
<Import Project="..\PostDeployScripts\IncludeSources.targets" Condition="Exists('..\PostDeployScripts\IncludeSources.targets')" />
</Project>

Просмотреть файл

@ -1,24 +0,0 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.27130.2024
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ContosoMaintenance.Bot.WebApp", "ContosoMaintenance.Bot.WebApp.csproj", "{9C7E3A46-B60F-4052-9A21-DC8D1A942216}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{9C7E3A46-B60F-4052-9A21-DC8D1A942216}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9C7E3A46-B60F-4052-9A21-DC8D1A942216}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9C7E3A46-B60F-4052-9A21-DC8D1A942216}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9C7E3A46-B60F-4052-9A21-DC8D1A942216}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {CF32C9E4-7251-4B2D-9AE2-EA65FDE232BB}
EndGlobalSection
EndGlobal

Просмотреть файл

@ -1,69 +0,0 @@
using System;
using System.Threading.Tasks;
using System.Web.Http;
using Microsoft.Bot.Connector;
using Microsoft.Bot.Builder.Dialogs;
using System.Web.Http.Description;
using System.Net.Http;
using System.Diagnostics;
namespace Microsoft.Bot.Sample.LuisBot
{
[BotAuthentication]
public class MessagesController : ApiController
{
/// <summary>
/// POST: api/Messages
/// receive a message from a user and send replies
/// </summary>
/// <param name="activity"></param>
[ResponseType(typeof(void))]
public virtual async Task<HttpResponseMessage> Post([FromBody] Activity activity)
{
// check if activity is of type message, this is what currently look for :)
if (activity.GetActivityType() == ActivityTypes.Message)
{
await Conversation.SendAsync(activity, () => new BasicLuisDialog());
}
else
{
HandleSystemMessage(activity);
}
return new HttpResponseMessage(System.Net.HttpStatusCode.Accepted);
}
Activity HandleSystemMessage(Activity message)
{
//The Bot Framework support a lot of message types. Here is sample of potential message types that you may want to support.
switch (message.Type)
{
case ActivityTypes.DeleteUserData:
// Implement user deletion here
// If we handle user deletion, return a real message
break;
case ActivityTypes.ConversationUpdate:
// Handle conversation state changes, like members being added and removed
// Use Activity.MembersAdded and Activity.MembersRemoved and Activity.Action for info
// Not available in all channels
break;
case ActivityTypes.ContactRelationUpdate:
// Handle add/remove from contact lists
// Activity.From + Activity.Action represent what happened
break;
case ActivityTypes.Typing:
// Handle knowing that the user is typing
break;
case ActivityTypes.Ping:
// Handle a ping message
break;
default:
//Handle other message types
break;
}
return null;
}
}
}

Просмотреть файл

@ -1,16 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace LuisBot.Definitions
{
public static class ServiceEntities
{
public const string TimeFrame = "maintenance.timeframe";
public const string ServiceType = "maintenance.type";
public const string ServiceDate = "maintenance.date";
public const string ServiceStatus = "maintenance.status";
}
}

Просмотреть файл

@ -1,116 +0,0 @@
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Globalization;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using CognitiveServicesBot.Services;
using LuisBot.Definitions;
using LuisBot.Dialogs;
using LuisBot.Models;
using LuisBot.Utils;
using Microsoft.Bot.Builder.Dialogs;
using Microsoft.Bot.Builder.Luis;
using Microsoft.Bot.Builder.Luis.Models;
using Microsoft.Bot.Connector;
namespace Microsoft.Bot.Sample.LuisBot
{
// For more information about this template visit http://aka.ms/azurebots-csharp-luis
[Serializable]
public class BasicLuisDialog : LuisDialog<object>
{
readonly AzureSearchService searchService = new AzureSearchService();
public BasicLuisDialog() : base(new LuisService(new LuisModelAttribute(
ConfigurationManager.AppSettings["LuisAppId"],
ConfigurationManager.AppSettings["LuisAPIKey"],
domain: ConfigurationManager.AppSettings["LuisAPIHostName"])))
{
}
[LuisIntent("None")]
public async Task NoneIntent(IDialogContext context, LuisResult result)
{
string response = "Sorry, what was that? I can only help w specific travels questions. Try asking me stuff like: what are my waiting jobs?";
await this.ShowLuisResult(context, result, response);
}
// Go to https://luis.ai and create a new intent, then train/publish your luis app.
[LuisIntent("greeting")]
public async Task GreetingIntent(IDialogContext context, LuisResult result)
{
await this.ShowLuisResult(context, result, "Hello there! Need maintenance jobs help? I've got you covered :)");
}
[LuisIntent("services.listjobs")]
public async Task ListJobsIntent(IDialogContext context, IAwaitable<IMessageActivity> message, LuisResult result)
{
{
var messageToForward = await message;
EntityRecommendation jobSearch;
if (result.TryFindEntity(ServiceEntities.ServiceStatus, out jobSearch))
{
var model = JobModelExtension.GetContextData(context);
// Title case the search entity for consistency
model.SearchTerm = new CultureInfo("en").TextInfo.ToTitleCase(jobSearch.Entity.ToLower());
var res = jobSearch.Resolution.Values;
var resV = res.ToList()[0] as List<object>;
model.ResolutionTerm = resV[0].ToString();
JobModelExtension.SetContextData(context, model);
await context.PostAsync($"OK, let me look for information on ({model.SearchTerm}) jobs.");
await context.Forward(new SearchServiceDialog(), AfterDialog, messageToForward, CancellationToken.None);
}
// If we cant identify a product entity, start an explore dialog
else
{
await context.PostAsync($"I couldn't find any jobs with the required status! Waiting, In Progress and Completed are the accepted status");
}
}
}
[LuisIntent("Cancel")]
public async Task CancelIntent(IDialogContext context, LuisResult result)
{
var response = "Thank you!";
await this.ShowLuisResult(context, result, response);
}
[LuisIntent("Help")]
public async Task HelpIntent(IDialogContext context, LuisResult result)
{
await this.ShowLuisResult(context, result);
}
async Task ShowLuisResult(IDialogContext context, LuisResult result)
{
//Sorry, what was that? I can only help w specific travels questions. Try asking me stuff like: ...
await context.PostAsync($"I couldn't understand {result.Intents[0].Intent}. You said: {result.Query}. I can answer questions like (what are my jobs?).");
context.Wait(MessageReceived);
}
async Task ShowLuisResult(IDialogContext context, LuisResult result, string customMessaage)
{
await context.PostAsync($"{customMessaage}");
context.Wait(MessageReceived);
}
async Task AfterDialog(IDialogContext context, IAwaitable<object> result)
{
var messageHandled = (string)await result;
if (!string.IsNullOrEmpty(messageHandled))
{
context.Done(messageHandled);
}
else
{
context.Done<object>(null);
}
}
}
}

Просмотреть файл

@ -1,92 +0,0 @@
using CognitiveServicesBot.Services;
using LuisBot.Models;
using LuisBot.Utils;
using Microsoft.Bot.Builder.Dialogs;
using Microsoft.Bot.Connector;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using LuisBot.Utils;
namespace LuisBot.Dialogs
{
[Serializable]
public class SearchServiceDialog : IDialog<object>
{
readonly AzureSearchService searchService = new AzureSearchService();
public async Task StartAsync(IDialogContext context)
{
context.Wait(this.MessageReceivedAsync);
}
public virtual async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> result)
{
var message = await result;
//You can indicate to the user you are running the query :)
//await context.PostAsync("Hold on one second!");
var model = JobModelExtension.GetContextData(context);
if(false)
{
//Here you can check if the intention is not found so you can list all the available options
}
else
{
var results = await searchService.FilterByStatus(model.ResolutionTerm);
var channelID = message.ChannelId;
//Check weather we have values in the search result
if (results.Values.Length > 0)
{
List<Attachment> foundItems = new List<Attachment>();
//To display the result in a nice card like boxes, we use custom CardUtil which provide a nice channel specific render of a card using Microsoft.Bot.Connector.Attachment
for (int i = 0; i < results.Values.Length; i++)
{
var searchItem = results.Values[i];
//We are not interested in deleted items
if (searchItem.IsDeleted == true)
continue;
var attachment = CardUtil.CreateCardAttachment(channelID, results.Values[i]);
foundItems.Add(attachment);
}
var reply = context.MakeMessage();
reply.AttachmentLayout = AttachmentLayoutTypes.List;
reply.Attachments = foundItems;
await context.PostAsync(reply);
context.Done<object>(null);
}
else
{
await context.PostAsync($"Sorry! I couldn't find anything that matched the search '{model.SearchTerm}'");
context.Done<object>(null);
}
}
}
async Task AfterDialog(IDialogContext context, IAwaitable<object> result)
{
var messageHandled = (string)await result;
if (!string.IsNullOrEmpty(messageHandled))
{
context.Done(messageHandled);
}
else
{
context.Done<object>(null);
}
}
}
}

Просмотреть файл

@ -1,37 +0,0 @@
#######################################################
# Step 1: Build the application in a container #
#######################################################
# Download the official ASP.NET Core SDK image
# to build the project while creating the docker image
FROM microsoft/dotnet:2.1-sdk-alpine as build
WORKDIR /app
# Restore NuGet packages
COPY *.csproj .
RUN dotnet restore
# Copy the rest of the files over
COPY . .
# Build the application
RUN dotnet publish --output /out/ --configuration Release
#######################################################
# Step 2: Run the build outcome in a container #
#######################################################
# Download the official ASP.NET Core Runtime image
# to run the compiled application
FROM microsoft/dotnet:2.1.3-aspnetcore-runtime-alpine
WORKDIR /app
# Open HTTP and HTTPS ports
EXPOSE 80
EXPOSE 443
# Copy the build output from the SDK image
COPY --from=build /out .
# Start the application
ENTRYPOINT ["dotnet", "ContosoMaintenance.Bot.dll"]

Просмотреть файл

@ -1 +0,0 @@
<%@ Application CodeBehind="Global.asax.cs" Inherits="SimpleEchoBot.WebApiApplication" Language="C#" %>

Просмотреть файл

@ -1,43 +0,0 @@
using System;
using System.Collections.Generic;
using Autofac;
using System.Web.Http;
using System.Configuration;
using System.Reflection;
using Microsoft.Bot.Builder.Azure;
using Microsoft.Bot.Builder.Dialogs;
using Microsoft.Bot.Builder.Dialogs.Internals;
using Microsoft.Bot.Connector;
namespace SimpleEchoBot
{
public class WebApiApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
// Bot Storage: This is a great spot to register the private state storage for your bot.
// We provide adapters for Azure Table, CosmosDb, SQL Azure, or you can implement your own!
// For samples and documentation, see: https://github.com/Microsoft/BotBuilder-Azure
Conversation.UpdateContainer(
builder =>
{
builder.RegisterModule(new AzureModule(Assembly.GetExecutingAssembly()));
// Using Azure Table Storage
var store = new TableBotDataStore(ConfigurationManager.AppSettings["AzureWebJobsStorage"]); // requires Microsoft.BotBuilder.Azure Nuget package
// To use CosmosDb or InMemory storage instead of the default table storage, uncomment the corresponding line below
// var store = new DocumentDbBotDataStore("cosmos db uri", "cosmos db key"); // requires Microsoft.BotBuilder.Azure Nuget package
// var store = new InMemoryDataStore(); // volatile in-memory store
builder.Register(c => store)
.Keyed<IBotDataStore<BotData>>(AzureModule.Key_DataStore)
.AsSelf()
.SingleInstance();
});
GlobalConfiguration.Configure(WebApiConfig.Register);
}
}
}

Просмотреть файл

@ -1,51 +0,0 @@
using Microsoft.Bot.Builder.Dialogs;
using Newtonsoft.Json;
using System;
namespace LuisBot.Models
{
public class JobModel
{
public const string ID = "JobModel";
public string SearchTerm { get; set; }
public string ResolutionTerm { get; set; }
//public static JobModel GetContextData(IDialogContext context)
//{
// JobModel model;
// context.ConversationData.TryGetValue<JobModel>(JobModel.ID, out model);
// if (model == null)
// {
// model = new JobModel();
// SetContextData(context, model);
// }
// return model;
//}
//public static void SetContextData(IDialogContext context, JobModel model)
//{
// context.ConversationData.SetValue<JobModel>(JobModel.ID, model);
//}
//public static void ClearContextData(IDialogContext context)
//{
// context.ConversationData.RemoveValue(JobModel.ID);
//}
}
public enum JobType
{
Installation,
Repair,
Service
}
public enum JobStatus
{
Waiting,
InProgress,
Complete
}
}

Просмотреть файл

@ -1,92 +0,0 @@
using Newtonsoft.Json;
using System;
namespace CognitiveServicesBot.Model
{
//As we are using direct Http calls to the Search APIs, we needed to use the below models
//In the future, this should be replaced with Azure Search Nuget for cleaner implementation.
//Data model for search
public class SearchResult
{
[JsonProperty("@odata.context")]
public string odatacontext { get; set; }
[JsonProperty("value")]
public Value[] Values { get; set; }
}
//Data model for fetching facets
public class FacetResult
{
[JsonProperty("@odata.context")]
public string ODataContext { get; set; }
[JsonProperty("@search.facets")]
public SearchFacets SearchFacets { get; set; }
[JsonProperty("value")]
public Value[] Values { get; set; }
}
public class Value
{
//The below JSON is returned from the search service:
// "@search.score":1.0,
// "name":"Testing again",
// "details":"oh I love to test. It\u2019s so much fun! ",
// "type":"Installation",
// "status":"Waiting",
// "id":"c0f66ccd-f5c6-418b-87a7-8497cefbaa0d",
// "createdAt":"2018-01-25T00:34:49.753Z"
//"@search.score": 1,
// "Name": "Service ATR 42 Engine",
// "Details": "General Service",
// "Type": "Service",
// "Status": "Complete",
// "DueDate": "0001-01-01T00:00:00Z",
// "id": "3de8f6d0-e1b6-416a-914d-cd13554929a5",
// "isDeleted": false
[JsonProperty("@search.score")]
public float SearchScore { get; set; }
[JsonProperty("Details")]
public string Details { get; set; }
[JsonProperty("Name")]
public string Name { get; set; }
[JsonProperty("Type")]
public string Type { get; set; }
[JsonProperty("Status")]
public string Status { get; set; }
[JsonProperty("id")]
public string Id { get; set; }
[JsonProperty("DueDate")]
public DateTime DueDate { get; set; }
[JsonProperty("isDeleted")]
public bool IsDeleted { get; set; }
}
public class SearchFacets
{
[JsonProperty("Category@odata.type")]
public string Categoryodatatype { get; set; }
[JsonProperty("Category")]
public Category[] Category { get; set; }
}
public class Category
{
[JsonProperty("count")]
public int Count { get; set; }
[JsonProperty("value")]
public string Value { get; set; }
}
}

Просмотреть файл

@ -1,12 +0,0 @@
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<CoreCompileDependsOn>$(CoreCompileDependsOn);IncludeSource</CoreCompileDependsOn>
</PropertyGroup>
<Target Name="IncludeSource">
<ItemGroup>
<Content Include="**\*.cs" />
<Content Include="**\*.csproj" />
<Content Include="PostDeployScripts\*.*" />
</ItemGroup>
</Target>
</Project>

Просмотреть файл

@ -1,9 +0,0 @@
{
"name": "{WEB_SITE_NAME}",
"description": "{WEB_SITE_NAME} Azure Bot Service Code",
"homepage": "https://github.com",
"private": false,
"has_issues": true,
"has_projects": true,
"has_wiki": true
}

Просмотреть файл

@ -1,70 +0,0 @@
@echo off
setlocal
SET password=%1
SET repoName=srcRepo
SET repoUrl=file:///%HOMEDRIVE:~0,1%/%HOMEPATH:~1%/site/%repoName%
SET download=bot-src
echo %repoUrl%
rem cd to project root
pushd ..\wwwroot
rem init git
call git init
call git config user.name "botframework"
call git config user.email "util@botframework.com"
call git add .
call git commit -m "prepare to download source"
call git remote add srcRepo %repoUrl%
popd
rem init upstream
pushd %HOME%\site
mkdir srcRepo
cd srcRepo
call git init --bare
popd
rem push to upstream
pushd ..\wwwroot
call git push --set-upstream srcRepo master
popd
rem clone srcRepo
pushd %HOME%\site
call git clone %repoUrl% %download%
rem delete .git
cd %download%
call rm -r -f .git
popd
rem prepare for publish
pushd %HOME%\site\%download%
mkdir Properties\PublishProfiles
pushd Properties\PublishProfiles
type ..\..\PostDeployScripts\publishProfile.xml.template | sed -e s/\{WEB_SITE_NAME\}/%WEBSITE_SITE_NAME%/g > %WEBSITE_SITE_NAME%-Web-Deploy.pubxml
popd
set SOLUTION_NAME=
for /f "delims=" %%a in ('dir /b *.sln') do @set SOLUTION_NAME=%%a
type PostDeployScripts\publish.cmd.template | sed -e s/\{SOLUTION_NAME\}/%SOLUTION_NAME%/g | sed -e s/\{PUBLISH_PROFILE\}/%WEBSITE_SITE_NAME%-Web-Deploy.pubxml/g | sed -e s/\{PASSWORD\}/%password%/g > publish.cmd
type PostDeployScripts\publishSettings.xml.template | sed -e s/\{WEB_SITE_NAME\}/%WEBSITE_SITE_NAME%/g | sed -e s/\{PASSWORD\}/%password%/g > PostDeployScripts\%WEBSITE_SITE_NAME%.PublishSettings
popd
rem preare the zip file
%HOMEDRIVE%\7zip\7za a %HOME%\site\%download%.zip %HOME%\site\%download%\*
rem cleanup git stuff
pushd ..\wwwroot
call rm -r -f .git
popd
pushd %HOME%\site
call rm -r -f %download%
call rm -r -f %repoName%
popd
endlocal

Просмотреть файл

@ -1,3 +0,0 @@
nuget restore
msbuild {SOLUTION_NAME} -p:DeployOnBuild=true -p:PublishProfile={PUBLISH_PROFILE} -p:Password={PASSWORD}

Просмотреть файл

@ -1,25 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
This file is used by the publish/package process of your Web project. You can customize the behavior of this process
by editing this MSBuild file. In order to learn more about this please visit https://go.microsoft.com/fwlink/?LinkID=208121.
-->
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<WebPublishMethod>MSDeploy</WebPublishMethod>
<PublishProvider>AzureWebSite</PublishProvider>
<LastUsedBuildConfiguration>Release</LastUsedBuildConfiguration>
<LastUsedPlatform>Any CPU</LastUsedPlatform>
<SiteUrlToLaunchAfterPublish>http://{WEB_SITE_NAME}.azurewebsites.net</SiteUrlToLaunchAfterPublish>
<LaunchSiteAfterPublish>True</LaunchSiteAfterPublish>
<ExcludeApp_Data>False</ExcludeApp_Data>
<MSDeployServiceURL>{WEB_SITE_NAME}.scm.azurewebsites.net:443</MSDeployServiceURL>
<DeployIisAppPath>{WEB_SITE_NAME}</DeployIisAppPath>
<RemoteSitePhysicalPath />
<SkipExtraFilesOnServer>True</SkipExtraFilesOnServer>
<MSDeployPublishMethod>WMSVC</MSDeployPublishMethod>
<EnableMSDeployBackup>True</EnableMSDeployBackup>
<UserName>${WEB_SITE_NAME}</UserName>
<_SavePWD>True</_SavePWD>
<_DestinationType>AzureWebSite</_DestinationType>
</PropertyGroup>
</Project>

Просмотреть файл

@ -1,15 +0,0 @@
<publishData>
<publishProfile profileName="{WEB_SITE_NAME}-Web-Deploy"
publishMethod="MSDeploy"
publishUrl="{WEB_SITE_NAME}.scm.azurewebsites.net:443"
msdeploySite="{WEB_SITE_NAME}" userName="${WEB_SITE_NAME}"
userPWD="{PASSWORD}"
destinationAppUrl="http://{WEB_SITE_NAME}.azurewebsites.net"
SQLServerDBConnectionString=""
mySQLDBConnectionString=""
hostingProviderForumLink=""
controlPanelLink="http://windows.azure.com"
webSystem="WebSites">
<databases />
</publishProfile>
</publishData>

Просмотреть файл

@ -1,23 +0,0 @@
@echo off
setlocal
set DEPLOYMENT_SOURCE=
set IN_PLACE_DEPLOYMENT=1
if exist ..\wwwroot\deploy.cmd (
pushd ..\wwwroot
rem call deploy.cmd
popd
)
rem kick of build of csproj
echo record deployment timestamp
date /t >> ..\deployment.log
time /t >> ..\deployment.log
echo ---------------------- >> ..\deployment.log
echo Deployment done
endlocal

Просмотреть файл

@ -1,44 +0,0 @@
@echo off
setlocal
rem ------------------------------------------------------------------------------------------
rem setupVsoRemoteRepo [remoteUser] [personalAccessToken] [projName{optional}]
rem create and populate VSO git repo for the ABS code instance
rem
rem remoteUser: user account name of the personal access token
rem personalAccessToken: the personal access token used to access github REST API (requires repos scope)
rem projName the name of the project to create (default to WEBSITE_SITE_NAME)
rem ------------------------------------------------------------------------------------------
set remoteUrl=https://api.github.com
set remoteUser=%1
set remotePwd=%2
set projName=%3
if '%projName%'=='' set projName=%WEBSITE_SITE_NAME%
set repoUrl=https://%remoteUser%:%remotePwd%@github.com/%remoteUser%/%projName%.git
rem use curl to create project
pushd ..\wwwroot
type PostDeployScripts\githubProject.json.template | sed -e s/\{WEB_SITE_NAME\}/%projName%/g > %TEMP%\githubProject.json
call curl -H "Content-Type: application/json" -u %remoteUser%:%remotePwd% -d "@%TEMP%\githubProject.json" -X POST %remoteUrl%/user/repos
rem rm %TEMP%\githubProject.json
popd
popd
rem cd to project root
pushd ..\wwwroot
rem init git
call git init
call git config user.name "%remoteUser%"
call git config user.password "%remotePwd%"
call git config user.email "util@botframework.com"
call git add .
call git commit -m "prepare to setup source control"
call git push %repoUrl% master
popd
rem cleanup git stuff
pushd ..\wwwroot
call rm -r -f .git
popd
endlocal

Просмотреть файл

@ -1,50 +0,0 @@
@echo off
setlocal
rem ------------------------------------------------------------------------------------------
rem setupVsoRemoteRepo [vsoRemote] [vsoUserName] [vsoPersonalAccessToken] [projName{optional}]
rem create and populate VSO git repo for the ABS code instance
rem
rem vsoRmote: url of the VSO site (e.g. https://awesomebot.visualstudio.com )
rem vosUserName: user account name of the personal access token
rem vsoPersonalAccessToken: the personal access token used to access VSO REST api
rem projName the name of the project to create (default to WEBSITE_SITE_NAME)
rem ------------------------------------------------------------------------------------------
set remoteUrl=%1
set remoteUser=%2
set remotePwd=%3
set projName=%4
if '%projName%'=='' set projName=%WEBSITE_SITE_NAME%
set vstsRoot=%remoteUrl%
set repoUrl=https://%remoteUser%:%remotePwd%@%remoteUrl:~8%/_git/%projName%
set vstsCreateProject=https://%remoteUser%:%remotePwd%@%remoteUrl:~8%/defaultcollection/_apis/projects?api-version=3.0
rem use curl to create project
pushd ..\wwwroot
type PostDeployScripts\vsoProject.json.template | sed -e s/\{WEB_SITE_NAME\}/%projName%/g > %TEMP%\vsoProject.json
call curl -H "Content-Type: application/json" -d "@%TEMP%\vsoProject.json" -X POST %vstsCreateProject%
rm %TEMP%\vsoProject.json
rem sleep for 15 seconds for the creation to complete, this is a wild guess
call sleep 15
popd
popd
rem cd to project root
pushd ..\wwwroot
rem init git
call git init
call git config user.name "%remoteUser%"
call git config user.password "%remotePwd%"
call git config user.email "util@botframework.com"
call git add .
call git commit -m "prepare to setup source control"
call git push %repoUrl% master
popd
rem cleanup git stuff
pushd ..\wwwroot
call rm -r -f .git
popd
endlocal

Просмотреть файл

@ -1,12 +0,0 @@
{
"name": "{WEB_SITE_NAME}",
"description": "{WEB_SITE_NAME} Azure Bot Service Code",
"capabilities": {
"versioncontrol": {
"sourceControlType": "Git"
},
"processTemplate": {
"templateTypeId": "6b724908-ef14-45cf-84f8-768b5384da45"
}
}
}

Просмотреть файл

@ -1,35 +0,0 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("SimpleEchoBot")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("SimpleEchoBot")]
[assembly: AssemblyCopyright("Copyright © 2015")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("a8ba1066-5695-4d71-abb4-65e5a5e0c3d4")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Revision and Build Numbers
// by using the '*' as shown below:
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

Просмотреть файл

@ -1,56 +0,0 @@
using System.Net.Http;
using System.Web.Configuration;
using System.Threading.Tasks;
using CognitiveServicesBot.Model;
using Newtonsoft.Json;
using System;
using System.Net;
namespace CognitiveServicesBot.Services
{
[Serializable]
public class AzureSearchService
{
static readonly string QueryString = $"https://{WebConfigurationManager.AppSettings["SearchName"]}.search.windows.net/indexes/{WebConfigurationManager.AppSettings["IndexName"]}/docs?api-key={WebConfigurationManager.AppSettings["SearchKey"]}&api-version=2016-09-01&";
public async Task<FacetResult> FetchFacets()
{
using (var httpClient = new HttpClient())
{
string facetQuey = $"{QueryString}facet=Category";
string response = await httpClient.GetStringAsync(facetQuey);
return JsonConvert.DeserializeObject<FacetResult>(response);
}
}
//Although this method is not used, but it show a nice demo of wide search of the index
//public async Task<SearchResult> Search(string value)
//{
// if (string.IsNullOrEmpty(value))
// throw new ArgumentNullException("Cannot search with a null value");
// using (var httpClient = new HttpClient())
// {
// string parsedSearch = WebUtility.UrlEncode(value);
// string query = $"{QueryString}search='{parsedSearch}'";
// string response = await httpClient.GetStringAsync(query);
// return JsonConvert.DeserializeObject<SearchResult>(response);
// }
//}
public async Task<SearchResult> FilterByStatus(string value)
{
if (string.IsNullOrEmpty(value))
throw new ArgumentNullException("Cannot search with a null value");
using (var httpClient = new HttpClient())
{
string parsedStatus = WebUtility.UrlEncode(value.Replace(" ", "+"));
//$filter=status eq 'Waiting'
string query = $"{QueryString}$filter=Status eq '{value}'";
string response = await httpClient.GetStringAsync(query);
return JsonConvert.DeserializeObject<SearchResult>(response);
}
}
}
}

Просмотреть файл

@ -1,128 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web.Configuration;
using AdaptiveCards;
using CognitiveServicesBot.Model;
using Microsoft.Bot.Connector;
namespace LuisBot.Utils
{
public static class CardUtil
{
public const string ContosoLogoUrl = "contosologo.png";
public static Attachment CreateCardAttachment(string channelID, Value value)
{
Attachment attachment = null;
switch (channelID)
{
case "skype":
attachment = CreateThumbnailCard(value).ToAttachment();
break;
default:
attachment = new Attachment()
{
ContentType = AdaptiveCard.ContentType,
Content = CreateFeatureCard(value)
};
break;
}
return attachment;
}
public static ThumbnailCard CreateThumbnailCard(Value value)
{
var card = new ThumbnailCard();
card.Title = value.Name;
card.Subtitle = value.Type + " / " + value.Status;
card.Images = new List<CardImage>()
{
new CardImage(string.Format(WebConfigurationManager.AppSettings["BotCardsBlobStorageURL"], ContosoLogoUrl))
};
card.Text = value.Details;
//If an action to be introduced to every job result, here is where to put it
//card.Buttons = new List<CardAction>()
//{
// new CardAction()
// {
// Value = value.id,
// Type = ActionTypes.OpenUrl,
// Title = "View Job"
// }
//};
return card;
}
public static AdaptiveCard CreateFeatureCard(Value value)
{
AdaptiveCard card = new AdaptiveCard();
card.Speak = value.Name;
card.Body = new List<CardElement> {
new ColumnSet
{
Columns =
{
new Column
{
Size = ColumnSize.Auto,
Items =
{
new Image
{
Url = string.Format(WebConfigurationManager.AppSettings["BotCardsBlobStorageURL"], ContosoLogoUrl),
Size = ImageSize.Small,
Style = ImageStyle.Normal
}
}
},
new Column
{
Size = ColumnSize.Stretch,
Items =
{
new TextBlock
{
Text = value.Name,
Weight = TextWeight.Bolder,
Size = TextSize.Large
}
}
}
}
},
new Container
{
Items =
{
new TextBlock
{
Text = value.Details,
Speak = value.Details,
Wrap = true
},
new FactSet
{
Facts =
{
new AdaptiveCards.Fact{Title = "Type", Value = value.Type},
new AdaptiveCards.Fact{Title = "Status", Value = value.Status}
}
}
}
}
};
//If an action to be introduced to every job result, here is where to put it
//card.Actions = new List<ActionBase>
//{
// new OpenUrlAction{Title = "View Job", Url=value.id}
//}
return card;
}
}
}

Просмотреть файл

@ -1,36 +0,0 @@
using LuisBot.Models;
using Microsoft.Bot.Builder.Dialogs;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace LuisBot.Utils
{
public static class JobModelExtension
{
public static JobModel GetContextData(IDialogContext context)
{
JobModel model;
context.ConversationData.TryGetValue<JobModel>(JobModel.ID, out model);
if (model == null)
{
model = new JobModel();
SetContextData(context, model);
}
return model;
}
public static void SetContextData(IDialogContext context, JobModel model)
{
context.ConversationData.SetValue<JobModel>(JobModel.ID, model);
}
public static void ClearContextData(IDialogContext context)
{
context.ConversationData.RemoveValue(JobModel.ID);
}
}
}

Просмотреть файл

@ -1,30 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<!--
In the example below, the "SetAttributes" transform will change the value of
"connectionString" to use "ReleaseSQLServer" only when the "Match" locator
finds an attribute "name" that has a value of "MyDB".
<connectionStrings>
<add name="MyDB"
connectionString="Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True"
xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
</connectionStrings>
-->
<system.web>
<!--
In the example below, the "Replace" transform will replace the entire
<customErrors> section of your web.config file.
Note that because there is only one customErrors section under the
<system.web> node, there is no need to use the "xdt:Locator" attribute.
<customErrors defaultRedirect="GenericError.htm"
mode="RemoteOnly" xdt:Transform="Replace">
<error statusCode="500" redirect="InternalError.htm"/>
</customErrors>
-->
</system.web>
</configuration>

Просмотреть файл

@ -1,31 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<!--
In the example below, the "SetAttributes" transform will change the value of
"connectionString" to use "ReleaseSQLServer" only when the "Match" locator
finds an attribute "name" that has a value of "MyDB".
<connectionStrings>
<add name="MyDB"
connectionString="Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True"
xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
</connectionStrings>
-->
<system.web>
<compilation xdt:Transform="RemoveAttributes(debug)" />
<!--
In the example below, the "Replace" transform will replace the entire
<customErrors> section of your web.config file.
Note that because there is only one customErrors section under the
<system.web> node, there is no need to use the "xdt:Locator" attribute.
<customErrors defaultRedirect="GenericError.htm"
mode="RemoteOnly" xdt:Transform="Replace">
<error statusCode="500" redirect="InternalError.htm"/>
</customErrors>
-->
</system.web>
</configuration>

Просмотреть файл

@ -1,119 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
For more information on how to configure your ASP.NET application, please visit
http://go.microsoft.com/fwlink/?LinkId=301879
-->
<configuration>
<configSections>
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</configSections>
<appSettings>
<!-- update these with your Microsoft App Id and your Microsoft App Password-->
<add key="MicrosoftAppId" value="YOURS" />
<add key="MicrosoftAppPassword" value="YOURS" />
<add key="SearchName" value="YOURS" />
<add key="IndexName" value="YOURS-index" />
<add key="SearchKey" value="YOURS" />
<add key="LuisAppId" value="YOURS" />
<add key="LuisAPIKey" value="YOURS" />
<add key="LuisAPIHostName" value="YOURS" />
<add key="AzureWebJobsStorage" value="YOURS" />
<add key="BotCardsBlobStorageURL" value="YOURS" />
</appSettings>
<!--
For a description of web.config changes see http://go.microsoft.com/fwlink/?LinkId=235367.
The following attributes can be set on the <httpRuntime> tag.
<system.Web>
<httpRuntime targetFramework="4.6" />
</system.Web>
-->
<system.web>
<customErrors mode="Off" />
<compilation debug="true" targetFramework="4.6" />
<httpRuntime targetFramework="4.6" />
</system.web>
<system.webServer>
<defaultDocument>
<files>
<clear />
<add value="default.htm" />
</files>
</defaultDocument>
<handlers>
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<remove name="OPTIONSVerbHandler" />
<remove name="TRACEVerbHandler" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="1.0.0.0-5.2.3.0" newVersion="5.2.3.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-9.0.0.0" newVersion="9.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Net.Http.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.2.29.0" newVersion="4.2.29.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Net.Http.Formatting" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-5.2.3.0" newVersion="5.2.3.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.IdentityModel.Tokens.Jwt" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-5.1.4.0" newVersion="5.1.4.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Bot.Connector" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-3.13.1.0" newVersion="3.13.1.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Bot.Builder" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-3.13.1.0" newVersion="3.13.1.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Azure.Documents.Client" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-1.11.0.0" newVersion="1.11.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Bot.Builder.History" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-3.13.1.0" newVersion="3.13.1.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Bot.Builder.Autofac" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-3.13.1.0" newVersion="3.13.1.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
<system.codedom>
<compilers>
<compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701" />
<compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+" />
</compilers>
</system.codedom>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
<parameters>
<parameter value="mssqllocaldb" />
</parameters>
</defaultConnectionFactory>
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
</entityFramework>
</configuration>

Просмотреть файл

@ -1,14 +0,0 @@
@echo off
setlocal
set DEPLOYMENT_SOURCE=
set IN_PLACE_DEPLOYMENT=1
if exist ..\wwwroot\deploy.cmd (
pushd ..\wwwroot
call deploy.cmd
popd
)
endlocal

Просмотреть файл

@ -1,21 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<title>Contoso Chat Bot</title>
<meta charset="utf-8" />
</head>
<body style="font-family:'Segoe UI'">
<h1>Contoso Luis Bot</h1>
<p>A bot that shows how to handle natural language using the Cognitive Services LUIS API with Azure Search to look for Jobs. </p>
<p>Here are some handy links to get started:</p>
<p>
<ul>
<li><a href="https://docs.microsoft.com/en-us/bot-framework/dotnet/bot-builder-dotnet-overview">Get started building bots with .NET.</a></li>
<li><a href="https://docs.microsoft.com/en-us/bot-framework/cognitive-services-bot-intelligence-overview#language-understanding">Learn more about LUIS and the Cognitive Services.</a></li>
<li><a href="https://www.luis.ai">Visit the LUIS portal.</a></li>
<li><a href="https://docs.microsoft.com/en-us/bot-framework/azure/azure-bot-service-continuous-deployment#set-up-continuous-deployment">Get the bot code and setup continuous deployment.</a></li>
<li><a href="https://docs.microsoft.com/en-us/bot-framework/debug-bots-emulator">Debug your bot.</a></li>
</ul>
</p>
</body>
</html>

Просмотреть файл

@ -1,116 +0,0 @@
@if "%SCM_TRACE_LEVEL%" NEQ "4" @echo off
:: ----------------------
:: KUDU Deployment Script
:: Version: 1.0.15
:: ----------------------
:: Prerequisites
:: -------------
:: Verify node.js installed
where node 2>nul >nul
IF %ERRORLEVEL% NEQ 0 (
echo Missing node.js executable, please install node.js, if already installed make sure it can be reached from current environment.
goto error
)
:: Setup
:: -----
setlocal enabledelayedexpansion
SET ARTIFACTS=%~dp0%..\artifacts
IF NOT DEFINED DEPLOYMENT_SOURCE (
SET DEPLOYMENT_SOURCE=%~dp0%.
)
IF NOT DEFINED DEPLOYMENT_TARGET (
SET DEPLOYMENT_TARGET=%ARTIFACTS%\wwwroot
)
IF NOT DEFINED NEXT_MANIFEST_PATH (
SET NEXT_MANIFEST_PATH=%ARTIFACTS%\manifest
IF NOT DEFINED PREVIOUS_MANIFEST_PATH (
SET PREVIOUS_MANIFEST_PATH=%ARTIFACTS%\manifest
)
)
IF NOT DEFINED KUDU_SYNC_CMD (
:: Install kudu sync
echo Installing Kudu Sync
call npm install kudusync -g --silent
IF !ERRORLEVEL! NEQ 0 goto error
:: Locally just running "kuduSync" would also work
SET KUDU_SYNC_CMD=%appdata%\npm\kuduSync.cmd
)
IF NOT DEFINED DEPLOYMENT_TEMP (
SET DEPLOYMENT_TEMP=%temp%\___deployTemp%random%
SET CLEAN_LOCAL_DEPLOYMENT_TEMP=true
)
IF DEFINED CLEAN_LOCAL_DEPLOYMENT_TEMP (
IF EXIST "%DEPLOYMENT_TEMP%" rd /s /q "%DEPLOYMENT_TEMP%"
mkdir "%DEPLOYMENT_TEMP%"
)
IF DEFINED MSBUILD_PATH goto MsbuildPathDefined
SET MSBUILD_PATH=%ProgramFiles(x86)%\MSBuild\14.0\Bin\MSBuild.exe
:MsbuildPathDefined
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Deployment
:: ----------
echo Handling .NET Web Application deployment.
:: 1. Restore NuGet packages
IF /I "Microsoft.Bot.Sample.LuisBot.sln" NEQ "" (
call :ExecuteCmd nuget restore "%DEPLOYMENT_SOURCE%\Microsoft.Bot.Sample.LuisBot.sln"
IF !ERRORLEVEL! NEQ 0 goto error
)
:: 2. Build to the temporary path
IF /I "%IN_PLACE_DEPLOYMENT%" NEQ "1" (
call :ExecuteCmd "%MSBUILD_PATH%" "%DEPLOYMENT_SOURCE%\Microsoft.Bot.Sample.LuisBot.csproj" /nologo /verbosity:m /t:Build /t:pipelinePreDeployCopyAllFilesToOneFolder /p:_PackageTempDir="%DEPLOYMENT_TEMP%";AutoParameterizationWebConfigConnectionStrings=false;Configuration=Release;UseSharedCompilation=false /p:SolutionDir="%DEPLOYMENT_SOURCE%\.\\" %SCM_BUILD_ARGS%
) ELSE (
call :ExecuteCmd "%MSBUILD_PATH%" "%DEPLOYMENT_SOURCE%\Microsoft.Bot.Sample.LuisBot.csproj" /nologo /verbosity:m /t:Build /p:AutoParameterizationWebConfigConnectionStrings=false;Configuration=Release;UseSharedCompilation=false /p:SolutionDir="%DEPLOYMENT_SOURCE%\.\\" %SCM_BUILD_ARGS%
)
IF !ERRORLEVEL! NEQ 0 goto error
:: 3. KuduSync
IF /I "%IN_PLACE_DEPLOYMENT%" NEQ "1" (
call :ExecuteCmd "%KUDU_SYNC_CMD%" -v 50 -f "%DEPLOYMENT_TEMP%" -t "%DEPLOYMENT_TARGET%" -n "%NEXT_MANIFEST_PATH%" -p "%PREVIOUS_MANIFEST_PATH%" -i ".git;.hg;.deployment;deploy.cmd"
IF !ERRORLEVEL! NEQ 0 goto error
)
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
goto end
:: Execute command routine that will echo out when error
:ExecuteCmd
setlocal
set _CMD_=%*
call %_CMD_%
if "%ERRORLEVEL%" NEQ "0" echo Failed exitCode=%ERRORLEVEL%, command=%_CMD_%
exit /b %ERRORLEVEL%
:error
endlocal
echo An error has occurred during web site deployment.
call :exitSetErrorLevel
call :exitFromFunction 2>nul
:exitSetErrorLevel
exit /b 1
:exitFromFunction
()
:end
endlocal
echo Finished successfully.

Просмотреть файл

@ -1,34 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Autofac" version="3.5.2" targetFramework="net46" />
<package id="Chronic.Signed" version="0.3.2" targetFramework="net46" />
<package id="EntityFramework" version="6.1.3" targetFramework="net46" />
<package id="Microsoft.AdaptiveCards" version="0.5.1" targetFramework="net46" />
<package id="Microsoft.AspNet.WebApi" version="5.2.3" targetFramework="net46" />
<package id="Microsoft.AspNet.WebApi.Client" version="5.2.3" targetFramework="net46" />
<package id="Microsoft.AspNet.WebApi.Core" version="5.2.3" targetFramework="net46" />
<package id="Microsoft.AspNet.WebApi.WebHost" version="5.2.3" targetFramework="net46" />
<package id="Microsoft.Azure.DocumentDB" version="1.11.0" targetFramework="net46" />
<package id="Microsoft.Azure.KeyVault.Core" version="1.0.0" targetFramework="net46" />
<package id="Microsoft.Bot.Builder" version="3.13.1" targetFramework="net46" />
<package id="Microsoft.Bot.Builder.Azure" version="3.2.5" targetFramework="net46" />
<package id="Microsoft.Bot.Builder.History" version="3.13.1" targetFramework="net46" />
<package id="Microsoft.Bot.Connector" version="3.13.1" targetFramework="net46" />
<package id="Microsoft.CodeDom.Providers.DotNetCompilerPlatform" version="1.0.1" targetFramework="net46" />
<package id="Microsoft.CSharp" version="4.3.0" targetFramework="net46" />
<package id="Microsoft.Data.Edm" version="5.6.4" targetFramework="net46" />
<package id="Microsoft.Data.OData" version="5.6.4" targetFramework="net46" />
<package id="Microsoft.Data.Services.Client" version="5.6.4" targetFramework="net46" />
<package id="Microsoft.IdentityModel.Logging" version="1.1.4" targetFramework="net46" />
<package id="Microsoft.IdentityModel.Protocol.Extensions" version="1.0.4.403061554" targetFramework="net46" />
<package id="Microsoft.IdentityModel.Protocols" version="2.1.4" targetFramework="net46" />
<package id="Microsoft.IdentityModel.Protocols.OpenIdConnect" version="2.1.4" targetFramework="net46" />
<package id="Microsoft.IdentityModel.Tokens" version="5.1.4" targetFramework="net46" />
<package id="Microsoft.Net.Compilers" version="1.2.1" targetFramework="net46" developmentDependency="true" />
<package id="Microsoft.Rest.ClientRuntime" version="2.3.2" targetFramework="net46" />
<package id="Microsoft.WindowsAzure.ConfigurationManager" version="3.2.1" targetFramework="net46" />
<package id="Newtonsoft.Json" version="9.0.1" targetFramework="net46" />
<package id="System.IdentityModel.Tokens.Jwt" version="5.1.4" targetFramework="net46" />
<package id="System.Spatial" version="5.6.4" targetFramework="net46" />
<package id="WindowsAzure.Storage" version="7.2.1" targetFramework="net46" />
</packages>

Просмотреть файл

@ -1,183 +1,244 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.27130.2027
MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WebAPI", "WebAPI", "{9F0FD859-1134-4C77-99E5-83703A2DE5A2}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Mobile", "Mobile", "{A652EB72-D4A3-41DF-80F8-D3DD0DDE5665}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Forms", "Forms", "{FB288840-5F2B-4124-B1B5-7FE6C7AFFD6A}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Test", "Test", "{F9802EBB-7857-4380-B1AD-F4CDE60F43F2}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Platforms", "Platforms", "{ED42B7AC-B4AD-4784-8FEF-2953A8A7CEDC}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ContosoFieldService.Core", "Mobile\ContosoFieldService.Core\ContosoFieldService.Core.csproj", "{8D50D622-6D39-4894-B679-BB60C5D60648}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Functions", "Functions", "{A5E6EEE2-C985-4C48-A6FD-BD95BFAA25EA}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ContosoFieldService.Droid", "Mobile\Droid\ContosoFieldService.Droid.csproj", "{7ABD1905-E31B-4857-B4EA-B47ED1C55D0C}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ContosoFieldService.iOS", "Mobile\iOS\ContosoFieldService.iOS.csproj", "{E2745280-BDD1-4F5D-B976-199B9AA7602C}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "BotWebApp", "BotWebApp", "{140A5FB1-CD49-4998-8196-74EF067452B3}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ContosoMaintenance.WebAPI", "Backend\Monolithic\ContosoMaintenance.WebAPI.csproj", "{00B72E49-9FD1-4A51-9F84-1A2FA55E27FB}"
EndProject
Project("{9344BDBB-3E7F-41FC-A0DD-8665D75EE146}") = "ContosoFieldService.UITests", "Mobile\UITests\ContosoFieldService.UITests.csproj", "{DC1A0167-8404-445B-AB7C-E14772DE2705}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ContosoMaintenance.Functions", "Backend\Functions\ContosoMaintenance.Functions.csproj", "{533FE30A-FACA-438A-9A29-E34BCB6A1EBB}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ContosoMaintenance.Bot.WebApp", "Backend\BotBackend\ContosoMaintenance.Bot.WebApp.csproj", "{9C7E3A46-B60F-4052-9A21-DC8D1A942216}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Debug|iPhone = Debug|iPhone
Debug|iPhoneSimulator = Debug|iPhoneSimulator
DebugBackend|Any CPU = DebugBackend|Any CPU
DebugBackend|iPhone = DebugBackend|iPhone
DebugBackend|iPhoneSimulator = DebugBackend|iPhoneSimulator
Release|Any CPU = Release|Any CPU
Release|iPhone = Release|iPhone
Release|iPhoneSimulator = Release|iPhoneSimulator
ReleaseBackend|Any CPU = ReleaseBackend|Any CPU
ReleaseBackend|iPhone = ReleaseBackend|iPhone
ReleaseBackend|iPhoneSimulator = ReleaseBackend|iPhoneSimulator
Test Cloud|Any CPU = Test Cloud|Any CPU
Test Cloud|iPhone = Test Cloud|iPhone
Test Cloud|iPhoneSimulator = Test Cloud|iPhoneSimulator
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{8D50D622-6D39-4894-B679-BB60C5D60648}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8D50D622-6D39-4894-B679-BB60C5D60648}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8D50D622-6D39-4894-B679-BB60C5D60648}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{8D50D622-6D39-4894-B679-BB60C5D60648}.Debug|iPhone.Build.0 = Debug|Any CPU
{8D50D622-6D39-4894-B679-BB60C5D60648}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{8D50D622-6D39-4894-B679-BB60C5D60648}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{8D50D622-6D39-4894-B679-BB60C5D60648}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8D50D622-6D39-4894-B679-BB60C5D60648}.Release|Any CPU.Build.0 = Release|Any CPU
{8D50D622-6D39-4894-B679-BB60C5D60648}.Release|iPhone.ActiveCfg = Release|Any CPU
{8D50D622-6D39-4894-B679-BB60C5D60648}.Release|iPhone.Build.0 = Release|Any CPU
{8D50D622-6D39-4894-B679-BB60C5D60648}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{8D50D622-6D39-4894-B679-BB60C5D60648}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{8D50D622-6D39-4894-B679-BB60C5D60648}.Test Cloud|Any CPU.ActiveCfg = Test Cloud|Any CPU
{8D50D622-6D39-4894-B679-BB60C5D60648}.Test Cloud|Any CPU.Build.0 = Test Cloud|Any CPU
{8D50D622-6D39-4894-B679-BB60C5D60648}.Test Cloud|iPhone.ActiveCfg = Test Cloud|Any CPU
{8D50D622-6D39-4894-B679-BB60C5D60648}.Test Cloud|iPhone.Build.0 = Test Cloud|Any CPU
{8D50D622-6D39-4894-B679-BB60C5D60648}.Test Cloud|iPhoneSimulator.ActiveCfg = Test Cloud|Any CPU
{8D50D622-6D39-4894-B679-BB60C5D60648}.Test Cloud|iPhoneSimulator.Build.0 = Test Cloud|Any CPU
{7ABD1905-E31B-4857-B4EA-B47ED1C55D0C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7ABD1905-E31B-4857-B4EA-B47ED1C55D0C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7ABD1905-E31B-4857-B4EA-B47ED1C55D0C}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{7ABD1905-E31B-4857-B4EA-B47ED1C55D0C}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{7ABD1905-E31B-4857-B4EA-B47ED1C55D0C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7ABD1905-E31B-4857-B4EA-B47ED1C55D0C}.Release|Any CPU.Build.0 = Release|Any CPU
{7ABD1905-E31B-4857-B4EA-B47ED1C55D0C}.Release|iPhone.ActiveCfg = Release|Any CPU
{7ABD1905-E31B-4857-B4EA-B47ED1C55D0C}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{7ABD1905-E31B-4857-B4EA-B47ED1C55D0C}.Test Cloud|Any CPU.ActiveCfg = Test Cloud|Any CPU
{7ABD1905-E31B-4857-B4EA-B47ED1C55D0C}.Test Cloud|Any CPU.Build.0 = Test Cloud|Any CPU
{7ABD1905-E31B-4857-B4EA-B47ED1C55D0C}.Test Cloud|iPhone.ActiveCfg = Test Cloud|Any CPU
{7ABD1905-E31B-4857-B4EA-B47ED1C55D0C}.Test Cloud|iPhone.Build.0 = Test Cloud|Any CPU
{7ABD1905-E31B-4857-B4EA-B47ED1C55D0C}.Test Cloud|iPhone.Deploy.0 = Test Cloud|Any CPU
{7ABD1905-E31B-4857-B4EA-B47ED1C55D0C}.Test Cloud|iPhoneSimulator.ActiveCfg = Test Cloud|Any CPU
{7ABD1905-E31B-4857-B4EA-B47ED1C55D0C}.Test Cloud|iPhoneSimulator.Build.0 = Test Cloud|Any CPU
{7ABD1905-E31B-4857-B4EA-B47ED1C55D0C}.Test Cloud|iPhoneSimulator.Deploy.0 = Test Cloud|Any CPU
{7ABD1905-E31B-4857-B4EA-B47ED1C55D0C}.Debug|iPhone.Build.0 = Debug|Any CPU
{7ABD1905-E31B-4857-B4EA-B47ED1C55D0C}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{7ABD1905-E31B-4857-B4EA-B47ED1C55D0C}.Release|iPhone.Build.0 = Release|Any CPU
{7ABD1905-E31B-4857-B4EA-B47ED1C55D0C}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{E2745280-BDD1-4F5D-B976-199B9AA7602C}.Debug|Any CPU.ActiveCfg = Debug|iPhoneSimulator
{E2745280-BDD1-4F5D-B976-199B9AA7602C}.Debug|Any CPU.Build.0 = Debug|iPhoneSimulator
{E2745280-BDD1-4F5D-B976-199B9AA7602C}.Debug|iPhone.ActiveCfg = Debug|iPhone
{E2745280-BDD1-4F5D-B976-199B9AA7602C}.Debug|iPhone.Build.0 = Debug|iPhone
{E2745280-BDD1-4F5D-B976-199B9AA7602C}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator
{E2745280-BDD1-4F5D-B976-199B9AA7602C}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator
{E2745280-BDD1-4F5D-B976-199B9AA7602C}.Release|Any CPU.ActiveCfg = Release|iPhoneSimulator
{E2745280-BDD1-4F5D-B976-199B9AA7602C}.Release|Any CPU.Build.0 = Release|iPhoneSimulator
{E2745280-BDD1-4F5D-B976-199B9AA7602C}.Release|iPhone.ActiveCfg = Release|iPhone
{E2745280-BDD1-4F5D-B976-199B9AA7602C}.Release|iPhone.Build.0 = Release|iPhone
{E2745280-BDD1-4F5D-B976-199B9AA7602C}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator
{E2745280-BDD1-4F5D-B976-199B9AA7602C}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator
{E2745280-BDD1-4F5D-B976-199B9AA7602C}.Test Cloud|Any CPU.ActiveCfg = Test Cloud|iPhone
{E2745280-BDD1-4F5D-B976-199B9AA7602C}.Test Cloud|Any CPU.Build.0 = Test Cloud|iPhone
{E2745280-BDD1-4F5D-B976-199B9AA7602C}.Test Cloud|iPhone.ActiveCfg = Test Cloud|iPhone
{E2745280-BDD1-4F5D-B976-199B9AA7602C}.Test Cloud|iPhone.Build.0 = Test Cloud|iPhone
{E2745280-BDD1-4F5D-B976-199B9AA7602C}.Test Cloud|iPhoneSimulator.ActiveCfg = Test Cloud|iPhoneSimulator
{E2745280-BDD1-4F5D-B976-199B9AA7602C}.Test Cloud|iPhoneSimulator.Build.0 = Test Cloud|iPhoneSimulator
{00B72E49-9FD1-4A51-9F84-1A2FA55E27FB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{00B72E49-9FD1-4A51-9F84-1A2FA55E27FB}.Debug|Any CPU.Build.0 = Debug|Any CPU
{00B72E49-9FD1-4A51-9F84-1A2FA55E27FB}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{00B72E49-9FD1-4A51-9F84-1A2FA55E27FB}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{00B72E49-9FD1-4A51-9F84-1A2FA55E27FB}.Release|Any CPU.ActiveCfg = Release|Any CPU
{00B72E49-9FD1-4A51-9F84-1A2FA55E27FB}.Release|Any CPU.Build.0 = Release|Any CPU
{00B72E49-9FD1-4A51-9F84-1A2FA55E27FB}.Release|iPhone.ActiveCfg = Release|Any CPU
{00B72E49-9FD1-4A51-9F84-1A2FA55E27FB}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{00B72E49-9FD1-4A51-9F84-1A2FA55E27FB}.Test Cloud|Any CPU.ActiveCfg = Release|Any CPU
{00B72E49-9FD1-4A51-9F84-1A2FA55E27FB}.Test Cloud|Any CPU.Build.0 = Release|Any CPU
{00B72E49-9FD1-4A51-9F84-1A2FA55E27FB}.Test Cloud|iPhone.ActiveCfg = Release|Any CPU
{00B72E49-9FD1-4A51-9F84-1A2FA55E27FB}.Test Cloud|iPhone.Build.0 = Release|Any CPU
{00B72E49-9FD1-4A51-9F84-1A2FA55E27FB}.Test Cloud|iPhoneSimulator.ActiveCfg = Release|Any CPU
{00B72E49-9FD1-4A51-9F84-1A2FA55E27FB}.Test Cloud|iPhoneSimulator.Build.0 = Release|Any CPU
{00B72E49-9FD1-4A51-9F84-1A2FA55E27FB}.Debug|iPhone.Build.0 = Debug|Any CPU
{00B72E49-9FD1-4A51-9F84-1A2FA55E27FB}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{00B72E49-9FD1-4A51-9F84-1A2FA55E27FB}.Release|iPhone.Build.0 = Release|Any CPU
{00B72E49-9FD1-4A51-9F84-1A2FA55E27FB}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{DC1A0167-8404-445B-AB7C-E14772DE2705}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{DC1A0167-8404-445B-AB7C-E14772DE2705}.Debug|Any CPU.Build.0 = Debug|Any CPU
{DC1A0167-8404-445B-AB7C-E14772DE2705}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{DC1A0167-8404-445B-AB7C-E14772DE2705}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{DC1A0167-8404-445B-AB7C-E14772DE2705}.Release|Any CPU.ActiveCfg = Release|Any CPU
{DC1A0167-8404-445B-AB7C-E14772DE2705}.Release|Any CPU.Build.0 = Release|Any CPU
{DC1A0167-8404-445B-AB7C-E14772DE2705}.Release|iPhone.ActiveCfg = Release|Any CPU
{DC1A0167-8404-445B-AB7C-E14772DE2705}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{DC1A0167-8404-445B-AB7C-E14772DE2705}.Test Cloud|Any CPU.ActiveCfg = Debug|Any CPU
{DC1A0167-8404-445B-AB7C-E14772DE2705}.Test Cloud|Any CPU.Build.0 = Debug|Any CPU
{DC1A0167-8404-445B-AB7C-E14772DE2705}.Test Cloud|iPhone.ActiveCfg = Release|Any CPU
{DC1A0167-8404-445B-AB7C-E14772DE2705}.Test Cloud|iPhone.Build.0 = Release|Any CPU
{DC1A0167-8404-445B-AB7C-E14772DE2705}.Test Cloud|iPhoneSimulator.ActiveCfg = Release|Any CPU
{DC1A0167-8404-445B-AB7C-E14772DE2705}.Test Cloud|iPhoneSimulator.Build.0 = Release|Any CPU
{533FE30A-FACA-438A-9A29-E34BCB6A1EBB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{533FE30A-FACA-438A-9A29-E34BCB6A1EBB}.Debug|Any CPU.Build.0 = Debug|Any CPU
{533FE30A-FACA-438A-9A29-E34BCB6A1EBB}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{533FE30A-FACA-438A-9A29-E34BCB6A1EBB}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{533FE30A-FACA-438A-9A29-E34BCB6A1EBB}.Release|Any CPU.ActiveCfg = Release|Any CPU
{533FE30A-FACA-438A-9A29-E34BCB6A1EBB}.Release|Any CPU.Build.0 = Release|Any CPU
{533FE30A-FACA-438A-9A29-E34BCB6A1EBB}.Release|iPhone.ActiveCfg = Release|Any CPU
{533FE30A-FACA-438A-9A29-E34BCB6A1EBB}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{533FE30A-FACA-438A-9A29-E34BCB6A1EBB}.Test Cloud|Any CPU.ActiveCfg = Release|Any CPU
{533FE30A-FACA-438A-9A29-E34BCB6A1EBB}.Test Cloud|Any CPU.Build.0 = Release|Any CPU
{533FE30A-FACA-438A-9A29-E34BCB6A1EBB}.Test Cloud|iPhone.ActiveCfg = Release|Any CPU
{533FE30A-FACA-438A-9A29-E34BCB6A1EBB}.Test Cloud|iPhone.Build.0 = Release|Any CPU
{533FE30A-FACA-438A-9A29-E34BCB6A1EBB}.Test Cloud|iPhoneSimulator.ActiveCfg = Release|Any CPU
{533FE30A-FACA-438A-9A29-E34BCB6A1EBB}.Test Cloud|iPhoneSimulator.Build.0 = Release|Any CPU
{533FE30A-FACA-438A-9A29-E34BCB6A1EBB}.Debug|iPhone.Build.0 = Debug|Any CPU
{533FE30A-FACA-438A-9A29-E34BCB6A1EBB}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{533FE30A-FACA-438A-9A29-E34BCB6A1EBB}.Release|iPhone.Build.0 = Release|Any CPU
{533FE30A-FACA-438A-9A29-E34BCB6A1EBB}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{FB288840-5F2B-4124-B1B5-7FE6C7AFFD6A} = {A652EB72-D4A3-41DF-80F8-D3DD0DDE5665}
{F9802EBB-7857-4380-B1AD-F4CDE60F43F2} = {FB288840-5F2B-4124-B1B5-7FE6C7AFFD6A}
{ED42B7AC-B4AD-4784-8FEF-2953A8A7CEDC} = {FB288840-5F2B-4124-B1B5-7FE6C7AFFD6A}
{8D50D622-6D39-4894-B679-BB60C5D60648} = {FB288840-5F2B-4124-B1B5-7FE6C7AFFD6A}
{7ABD1905-E31B-4857-B4EA-B47ED1C55D0C} = {ED42B7AC-B4AD-4784-8FEF-2953A8A7CEDC}
{E2745280-BDD1-4F5D-B976-199B9AA7602C} = {ED42B7AC-B4AD-4784-8FEF-2953A8A7CEDC}
{00B72E49-9FD1-4A51-9F84-1A2FA55E27FB} = {9F0FD859-1134-4C77-99E5-83703A2DE5A2}
{DC1A0167-8404-445B-AB7C-E14772DE2705} = {F9802EBB-7857-4380-B1AD-F4CDE60F43F2}
{533FE30A-FACA-438A-9A29-E34BCB6A1EBB} = {A5E6EEE2-C985-4C48-A6FD-BD95BFAA25EA}
{9C7E3A46-B60F-4052-9A21-DC8D1A942216} = {140A5FB1-CD49-4998-8196-74EF067452B3}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {60FF5FF1-44FA-4082-8169-95F16F23BE13}
EndGlobalSection
GlobalSection(MonoDevelopProperties) = preSolution
Policies = $0
$0.DotNetNamingPolicy = $1
$1.DirectoryNamespaceAssociation = PrefixedHierarchical
$0.TextStylePolicy = $20
EndGlobalSection
EndGlobal
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.27130.2027
MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WebAPI", "WebAPI", "{9F0FD859-1134-4C77-99E5-83703A2DE5A2}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Mobile", "Mobile", "{A652EB72-D4A3-41DF-80F8-D3DD0DDE5665}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Test", "Test", "{F9802EBB-7857-4380-B1AD-F4CDE60F43F2}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Platforms", "Platforms", "{ED42B7AC-B4AD-4784-8FEF-2953A8A7CEDC}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ContosoFieldService.Core", "Mobile\ContosoFieldService.Core\ContosoFieldService.Core.csproj", "{8D50D622-6D39-4894-B679-BB60C5D60648}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Functions", "Functions", "{A5E6EEE2-C985-4C48-A6FD-BD95BFAA25EA}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ContosoFieldService.Droid", "Mobile\Droid\ContosoFieldService.Droid.csproj", "{7ABD1905-E31B-4857-B4EA-B47ED1C55D0C}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ContosoFieldService.iOS", "Mobile\iOS\ContosoFieldService.iOS.csproj", "{E2745280-BDD1-4F5D-B976-199B9AA7602C}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ContosoMaintenance.WebAPI", "Backend\Monolithic\ContosoMaintenance.WebAPI.csproj", "{4D37B422-71A1-41EC-A389-7FC1D3D76F40}"
EndProject
Project("{9344BDBB-3E7F-41FC-A0DD-8665D75EE146}") = "ContosoFieldService.UITests", "Mobile\UITests\ContosoFieldService.UITests.csproj", "{32E514F2-5855-4301-A6EC-387B6BED09B7}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ContosoMaintenance.Functions", "Backend\Functions\ContosoMaintenance.Functions.csproj", "{D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Backend", "Backend", "{8B8DB082-89C7-4554-AA41-18F3ACA8F3AD}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Bot", "Bot", "{5790C1F9-2943-448E-82CC-3D4DB963F189}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ContosoMaintenance.Bot", "Backend\Bot\ContosoMaintenance.Bot.csproj", "{A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Debug|iPhone = Debug|iPhone
Debug|iPhoneSimulator = Debug|iPhoneSimulator
DebugBackend|Any CPU = DebugBackend|Any CPU
DebugBackend|iPhone = DebugBackend|iPhone
DebugBackend|iPhoneSimulator = DebugBackend|iPhoneSimulator
Release|Any CPU = Release|Any CPU
Release|iPhone = Release|iPhone
Release|iPhoneSimulator = Release|iPhoneSimulator
ReleaseBackend|Any CPU = ReleaseBackend|Any CPU
ReleaseBackend|iPhone = ReleaseBackend|iPhone
ReleaseBackend|iPhoneSimulator = ReleaseBackend|iPhoneSimulator
Test Cloud|Any CPU = Test Cloud|Any CPU
Test Cloud|iPhone = Test Cloud|iPhone
Test Cloud|iPhoneSimulator = Test Cloud|iPhoneSimulator
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{8D50D622-6D39-4894-B679-BB60C5D60648}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8D50D622-6D39-4894-B679-BB60C5D60648}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8D50D622-6D39-4894-B679-BB60C5D60648}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{8D50D622-6D39-4894-B679-BB60C5D60648}.Debug|iPhone.Build.0 = Debug|Any CPU
{8D50D622-6D39-4894-B679-BB60C5D60648}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{8D50D622-6D39-4894-B679-BB60C5D60648}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{8D50D622-6D39-4894-B679-BB60C5D60648}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8D50D622-6D39-4894-B679-BB60C5D60648}.Release|Any CPU.Build.0 = Release|Any CPU
{8D50D622-6D39-4894-B679-BB60C5D60648}.Release|iPhone.ActiveCfg = Release|Any CPU
{8D50D622-6D39-4894-B679-BB60C5D60648}.Release|iPhone.Build.0 = Release|Any CPU
{8D50D622-6D39-4894-B679-BB60C5D60648}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{8D50D622-6D39-4894-B679-BB60C5D60648}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{8D50D622-6D39-4894-B679-BB60C5D60648}.Test Cloud|Any CPU.ActiveCfg = Test Cloud|Any CPU
{8D50D622-6D39-4894-B679-BB60C5D60648}.Test Cloud|Any CPU.Build.0 = Test Cloud|Any CPU
{8D50D622-6D39-4894-B679-BB60C5D60648}.Test Cloud|iPhone.ActiveCfg = Test Cloud|Any CPU
{8D50D622-6D39-4894-B679-BB60C5D60648}.Test Cloud|iPhone.Build.0 = Test Cloud|Any CPU
{8D50D622-6D39-4894-B679-BB60C5D60648}.Test Cloud|iPhoneSimulator.ActiveCfg = Test Cloud|Any CPU
{8D50D622-6D39-4894-B679-BB60C5D60648}.Test Cloud|iPhoneSimulator.Build.0 = Test Cloud|Any CPU
{7ABD1905-E31B-4857-B4EA-B47ED1C55D0C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7ABD1905-E31B-4857-B4EA-B47ED1C55D0C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7ABD1905-E31B-4857-B4EA-B47ED1C55D0C}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{7ABD1905-E31B-4857-B4EA-B47ED1C55D0C}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{7ABD1905-E31B-4857-B4EA-B47ED1C55D0C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7ABD1905-E31B-4857-B4EA-B47ED1C55D0C}.Release|Any CPU.Build.0 = Release|Any CPU
{7ABD1905-E31B-4857-B4EA-B47ED1C55D0C}.Release|iPhone.ActiveCfg = Release|Any CPU
{7ABD1905-E31B-4857-B4EA-B47ED1C55D0C}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{7ABD1905-E31B-4857-B4EA-B47ED1C55D0C}.Test Cloud|Any CPU.ActiveCfg = Test Cloud|Any CPU
{7ABD1905-E31B-4857-B4EA-B47ED1C55D0C}.Test Cloud|Any CPU.Build.0 = Test Cloud|Any CPU
{7ABD1905-E31B-4857-B4EA-B47ED1C55D0C}.Test Cloud|iPhone.ActiveCfg = Test Cloud|Any CPU
{7ABD1905-E31B-4857-B4EA-B47ED1C55D0C}.Test Cloud|iPhone.Build.0 = Test Cloud|Any CPU
{7ABD1905-E31B-4857-B4EA-B47ED1C55D0C}.Test Cloud|iPhone.Deploy.0 = Test Cloud|Any CPU
{7ABD1905-E31B-4857-B4EA-B47ED1C55D0C}.Test Cloud|iPhoneSimulator.ActiveCfg = Test Cloud|Any CPU
{7ABD1905-E31B-4857-B4EA-B47ED1C55D0C}.Test Cloud|iPhoneSimulator.Build.0 = Test Cloud|Any CPU
{7ABD1905-E31B-4857-B4EA-B47ED1C55D0C}.Test Cloud|iPhoneSimulator.Deploy.0 = Test Cloud|Any CPU
{7ABD1905-E31B-4857-B4EA-B47ED1C55D0C}.Debug|iPhone.Build.0 = Debug|Any CPU
{7ABD1905-E31B-4857-B4EA-B47ED1C55D0C}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{7ABD1905-E31B-4857-B4EA-B47ED1C55D0C}.Release|iPhone.Build.0 = Release|Any CPU
{7ABD1905-E31B-4857-B4EA-B47ED1C55D0C}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{E2745280-BDD1-4F5D-B976-199B9AA7602C}.Debug|Any CPU.ActiveCfg = Debug|iPhoneSimulator
{E2745280-BDD1-4F5D-B976-199B9AA7602C}.Debug|Any CPU.Build.0 = Debug|iPhoneSimulator
{E2745280-BDD1-4F5D-B976-199B9AA7602C}.Debug|iPhone.ActiveCfg = Debug|iPhone
{E2745280-BDD1-4F5D-B976-199B9AA7602C}.Debug|iPhone.Build.0 = Debug|iPhone
{E2745280-BDD1-4F5D-B976-199B9AA7602C}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator
{E2745280-BDD1-4F5D-B976-199B9AA7602C}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator
{E2745280-BDD1-4F5D-B976-199B9AA7602C}.Release|Any CPU.ActiveCfg = Release|iPhoneSimulator
{E2745280-BDD1-4F5D-B976-199B9AA7602C}.Release|Any CPU.Build.0 = Release|iPhoneSimulator
{E2745280-BDD1-4F5D-B976-199B9AA7602C}.Release|iPhone.ActiveCfg = Release|iPhone
{E2745280-BDD1-4F5D-B976-199B9AA7602C}.Release|iPhone.Build.0 = Release|iPhone
{E2745280-BDD1-4F5D-B976-199B9AA7602C}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator
{E2745280-BDD1-4F5D-B976-199B9AA7602C}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator
{E2745280-BDD1-4F5D-B976-199B9AA7602C}.Test Cloud|Any CPU.ActiveCfg = Test Cloud|iPhone
{E2745280-BDD1-4F5D-B976-199B9AA7602C}.Test Cloud|Any CPU.Build.0 = Test Cloud|iPhone
{E2745280-BDD1-4F5D-B976-199B9AA7602C}.Test Cloud|iPhone.ActiveCfg = Test Cloud|iPhone
{E2745280-BDD1-4F5D-B976-199B9AA7602C}.Test Cloud|iPhone.Build.0 = Test Cloud|iPhone
{E2745280-BDD1-4F5D-B976-199B9AA7602C}.Test Cloud|iPhoneSimulator.ActiveCfg = Test Cloud|iPhoneSimulator
{E2745280-BDD1-4F5D-B976-199B9AA7602C}.Test Cloud|iPhoneSimulator.Build.0 = Test Cloud|iPhoneSimulator
{4D37B422-71A1-41EC-A389-7FC1D3D76F40}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4D37B422-71A1-41EC-A389-7FC1D3D76F40}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4D37B422-71A1-41EC-A389-7FC1D3D76F40}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{4D37B422-71A1-41EC-A389-7FC1D3D76F40}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{4D37B422-71A1-41EC-A389-7FC1D3D76F40}.DebugBackend|Any CPU.ActiveCfg = Debug|Any CPU
{4D37B422-71A1-41EC-A389-7FC1D3D76F40}.DebugBackend|Any CPU.Build.0 = Debug|Any CPU
{4D37B422-71A1-41EC-A389-7FC1D3D76F40}.DebugBackend|iPhone.ActiveCfg = Debug|Any CPU
{4D37B422-71A1-41EC-A389-7FC1D3D76F40}.DebugBackend|iPhone.Build.0 = Debug|Any CPU
{4D37B422-71A1-41EC-A389-7FC1D3D76F40}.DebugBackend|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{4D37B422-71A1-41EC-A389-7FC1D3D76F40}.DebugBackend|iPhoneSimulator.Build.0 = Debug|Any CPU
{4D37B422-71A1-41EC-A389-7FC1D3D76F40}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4D37B422-71A1-41EC-A389-7FC1D3D76F40}.Release|Any CPU.Build.0 = Release|Any CPU
{4D37B422-71A1-41EC-A389-7FC1D3D76F40}.Release|iPhone.ActiveCfg = Release|Any CPU
{4D37B422-71A1-41EC-A389-7FC1D3D76F40}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{4D37B422-71A1-41EC-A389-7FC1D3D76F40}.ReleaseBackend|Any CPU.ActiveCfg = Release|Any CPU
{4D37B422-71A1-41EC-A389-7FC1D3D76F40}.ReleaseBackend|Any CPU.Build.0 = Release|Any CPU
{4D37B422-71A1-41EC-A389-7FC1D3D76F40}.ReleaseBackend|iPhone.ActiveCfg = Release|Any CPU
{4D37B422-71A1-41EC-A389-7FC1D3D76F40}.ReleaseBackend|iPhone.Build.0 = Release|Any CPU
{4D37B422-71A1-41EC-A389-7FC1D3D76F40}.ReleaseBackend|iPhoneSimulator.ActiveCfg = Release|Any CPU
{4D37B422-71A1-41EC-A389-7FC1D3D76F40}.ReleaseBackend|iPhoneSimulator.Build.0 = Release|Any CPU
{4D37B422-71A1-41EC-A389-7FC1D3D76F40}.Test Cloud|Any CPU.ActiveCfg = Debug|Any CPU
{4D37B422-71A1-41EC-A389-7FC1D3D76F40}.Test Cloud|Any CPU.Build.0 = Debug|Any CPU
{4D37B422-71A1-41EC-A389-7FC1D3D76F40}.Test Cloud|iPhone.ActiveCfg = Release|Any CPU
{4D37B422-71A1-41EC-A389-7FC1D3D76F40}.Test Cloud|iPhone.Build.0 = Release|Any CPU
{4D37B422-71A1-41EC-A389-7FC1D3D76F40}.Test Cloud|iPhoneSimulator.ActiveCfg = Release|Any CPU
{4D37B422-71A1-41EC-A389-7FC1D3D76F40}.Test Cloud|iPhoneSimulator.Build.0 = Release|Any CPU
{32E514F2-5855-4301-A6EC-387B6BED09B7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{32E514F2-5855-4301-A6EC-387B6BED09B7}.Debug|Any CPU.Build.0 = Debug|Any CPU
{32E514F2-5855-4301-A6EC-387B6BED09B7}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{32E514F2-5855-4301-A6EC-387B6BED09B7}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{32E514F2-5855-4301-A6EC-387B6BED09B7}.DebugBackend|Any CPU.ActiveCfg = Debug|Any CPU
{32E514F2-5855-4301-A6EC-387B6BED09B7}.DebugBackend|Any CPU.Build.0 = Debug|Any CPU
{32E514F2-5855-4301-A6EC-387B6BED09B7}.DebugBackend|iPhone.ActiveCfg = Debug|Any CPU
{32E514F2-5855-4301-A6EC-387B6BED09B7}.DebugBackend|iPhone.Build.0 = Debug|Any CPU
{32E514F2-5855-4301-A6EC-387B6BED09B7}.DebugBackend|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{32E514F2-5855-4301-A6EC-387B6BED09B7}.DebugBackend|iPhoneSimulator.Build.0 = Debug|Any CPU
{32E514F2-5855-4301-A6EC-387B6BED09B7}.Release|Any CPU.ActiveCfg = Release|Any CPU
{32E514F2-5855-4301-A6EC-387B6BED09B7}.Release|Any CPU.Build.0 = Release|Any CPU
{32E514F2-5855-4301-A6EC-387B6BED09B7}.Release|iPhone.ActiveCfg = Release|Any CPU
{32E514F2-5855-4301-A6EC-387B6BED09B7}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{32E514F2-5855-4301-A6EC-387B6BED09B7}.ReleaseBackend|Any CPU.ActiveCfg = Release|Any CPU
{32E514F2-5855-4301-A6EC-387B6BED09B7}.ReleaseBackend|Any CPU.Build.0 = Release|Any CPU
{32E514F2-5855-4301-A6EC-387B6BED09B7}.ReleaseBackend|iPhone.ActiveCfg = Release|Any CPU
{32E514F2-5855-4301-A6EC-387B6BED09B7}.ReleaseBackend|iPhone.Build.0 = Release|Any CPU
{32E514F2-5855-4301-A6EC-387B6BED09B7}.ReleaseBackend|iPhoneSimulator.ActiveCfg = Release|Any CPU
{32E514F2-5855-4301-A6EC-387B6BED09B7}.ReleaseBackend|iPhoneSimulator.Build.0 = Release|Any CPU
{32E514F2-5855-4301-A6EC-387B6BED09B7}.Test Cloud|Any CPU.ActiveCfg = Debug|Any CPU
{32E514F2-5855-4301-A6EC-387B6BED09B7}.Test Cloud|Any CPU.Build.0 = Debug|Any CPU
{32E514F2-5855-4301-A6EC-387B6BED09B7}.Test Cloud|iPhone.ActiveCfg = Release|Any CPU
{32E514F2-5855-4301-A6EC-387B6BED09B7}.Test Cloud|iPhone.Build.0 = Release|Any CPU
{32E514F2-5855-4301-A6EC-387B6BED09B7}.Test Cloud|iPhoneSimulator.ActiveCfg = Release|Any CPU
{32E514F2-5855-4301-A6EC-387B6BED09B7}.Test Cloud|iPhoneSimulator.Build.0 = Release|Any CPU
{D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.DebugBackend|Any CPU.ActiveCfg = Debug|Any CPU
{D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.DebugBackend|Any CPU.Build.0 = Debug|Any CPU
{D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.DebugBackend|iPhone.ActiveCfg = Debug|Any CPU
{D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.DebugBackend|iPhone.Build.0 = Debug|Any CPU
{D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.DebugBackend|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.DebugBackend|iPhoneSimulator.Build.0 = Debug|Any CPU
{D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.Release|Any CPU.Build.0 = Release|Any CPU
{D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.Release|iPhone.ActiveCfg = Release|Any CPU
{D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.ReleaseBackend|Any CPU.ActiveCfg = Release|Any CPU
{D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.ReleaseBackend|Any CPU.Build.0 = Release|Any CPU
{D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.ReleaseBackend|iPhone.ActiveCfg = Release|Any CPU
{D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.ReleaseBackend|iPhone.Build.0 = Release|Any CPU
{D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.ReleaseBackend|iPhoneSimulator.ActiveCfg = Release|Any CPU
{D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.ReleaseBackend|iPhoneSimulator.Build.0 = Release|Any CPU
{D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.Test Cloud|Any CPU.ActiveCfg = Debug|Any CPU
{D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.Test Cloud|Any CPU.Build.0 = Debug|Any CPU
{D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.Test Cloud|iPhone.ActiveCfg = Release|Any CPU
{D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.Test Cloud|iPhone.Build.0 = Release|Any CPU
{D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.Test Cloud|iPhoneSimulator.ActiveCfg = Release|Any CPU
{D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3}.Test Cloud|iPhoneSimulator.Build.0 = Release|Any CPU
{A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.Debug|iPhone.Build.0 = Debug|Any CPU
{A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.DebugBackend|Any CPU.ActiveCfg = Debug|Any CPU
{A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.DebugBackend|Any CPU.Build.0 = Debug|Any CPU
{A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.DebugBackend|iPhone.ActiveCfg = Debug|Any CPU
{A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.DebugBackend|iPhone.Build.0 = Debug|Any CPU
{A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.DebugBackend|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.DebugBackend|iPhoneSimulator.Build.0 = Debug|Any CPU
{A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.Release|Any CPU.Build.0 = Release|Any CPU
{A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.Release|iPhone.ActiveCfg = Release|Any CPU
{A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.Release|iPhone.Build.0 = Release|Any CPU
{A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.ReleaseBackend|Any CPU.ActiveCfg = Release|Any CPU
{A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.ReleaseBackend|Any CPU.Build.0 = Release|Any CPU
{A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.ReleaseBackend|iPhone.ActiveCfg = Release|Any CPU
{A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.ReleaseBackend|iPhone.Build.0 = Release|Any CPU
{A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.ReleaseBackend|iPhoneSimulator.ActiveCfg = Release|Any CPU
{A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.ReleaseBackend|iPhoneSimulator.Build.0 = Release|Any CPU
{A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.Test Cloud|Any CPU.ActiveCfg = Release|Any CPU
{A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.Test Cloud|Any CPU.Build.0 = Release|Any CPU
{A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.Test Cloud|iPhone.ActiveCfg = Release|Any CPU
{A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.Test Cloud|iPhone.Build.0 = Release|Any CPU
{A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.Test Cloud|iPhoneSimulator.ActiveCfg = Release|Any CPU
{A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884}.Test Cloud|iPhoneSimulator.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{F9802EBB-7857-4380-B1AD-F4CDE60F43F2} = {A652EB72-D4A3-41DF-80F8-D3DD0DDE5665}
{ED42B7AC-B4AD-4784-8FEF-2953A8A7CEDC} = {A652EB72-D4A3-41DF-80F8-D3DD0DDE5665}
{8D50D622-6D39-4894-B679-BB60C5D60648} = {A652EB72-D4A3-41DF-80F8-D3DD0DDE5665}
{7ABD1905-E31B-4857-B4EA-B47ED1C55D0C} = {ED42B7AC-B4AD-4784-8FEF-2953A8A7CEDC}
{E2745280-BDD1-4F5D-B976-199B9AA7602C} = {ED42B7AC-B4AD-4784-8FEF-2953A8A7CEDC}
{4D37B422-71A1-41EC-A389-7FC1D3D76F40} = {9F0FD859-1134-4C77-99E5-83703A2DE5A2}
{32E514F2-5855-4301-A6EC-387B6BED09B7} = {F9802EBB-7857-4380-B1AD-F4CDE60F43F2}
{D6D37A12-8F14-4A5E-8C63-35F2B0AC57B3} = {A5E6EEE2-C985-4C48-A6FD-BD95BFAA25EA}
{A5E6EEE2-C985-4C48-A6FD-BD95BFAA25EA} = {8B8DB082-89C7-4554-AA41-18F3ACA8F3AD}
{9F0FD859-1134-4C77-99E5-83703A2DE5A2} = {8B8DB082-89C7-4554-AA41-18F3ACA8F3AD}
{5790C1F9-2943-448E-82CC-3D4DB963F189} = {8B8DB082-89C7-4554-AA41-18F3ACA8F3AD}
{A1C7E4EF-BB7C-4DB5-9E2B-5FFC2C3E0884} = {5790C1F9-2943-448E-82CC-3D4DB963F189}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {60FF5FF1-44FA-4082-8169-95F16F23BE13}
EndGlobalSection
GlobalSection(MonoDevelopProperties) = preSolution
Policies = $0
$0.DotNetNamingPolicy = $1
$1.DirectoryNamespaceAssociation = PrefixedHierarchical
$0.TextStylePolicy = $20
EndGlobalSection
EndGlobal

1612
Mobile/Droid/Resources/Resource.designer.cs сгенерированный

Разница между файлами не показана из-за своего большого размера Загрузить разницу