如何使用c#使用IBM Watson Dialog服务

本文关键字:Watson Dialog 服务 IBM 使用 何使用 | 更新日期: 2023-09-27 18:19:55

一个客户端正在使用IBM的Watson Dialog服务,我找不到任何人使用.Net(特别是c#)做最基本的事情的例子。

IBM只展示了使用Curl、Node和Java的示例。。。

我的第一个目标是能够向watson服务添加一个新的xml文件(对话框树)。看起来很简单,但我已经头疼了一段时间了。

如何使用c#使用IBM Watson Dialog服务

因此,我通过拼凑十几个相关主题的谷歌搜索,终于完成了这项工作。我想我会在这里发布工作版本。

下面是我的代码,它将在MVC控制器中使用C#将xml文件上传到WatsonDialog服务。

前端是一个表单,它采用一个友好的名称(我将其转换为.xml文件名),并上传文件本身(使用dropzone)。

我确信可能会有优化,但我希望这能帮助到一些人。好消息是,这可以作为执行任何WatsonDialog服务调用(添加、更新、删除)的基础。

    public ContentResult Save(FormCollection form)
    {
        try
        {
            var name = form["txtDialogName"];
            var filename = name + ".xml";
            byte[] bytes = null;
            foreach (string s in Request.Files)
            {
                var file = Request.Files[s];
                using (Stream inputStream = file.InputStream)
                {
                    MemoryStream memoryStream = inputStream as MemoryStream;
                    if (memoryStream == null)
                    {
                        memoryStream = new MemoryStream();
                        inputStream.CopyTo(memoryStream);
                    }
                    bytes = memoryStream.ToArray();
                }
                break;
            }
            if (bytes == null)
            {
                var contentResult = new ContentResult
                {
                    ContentType = "application/json",
                    Content = null
                };
                return contentResult;
            }

            var basePath = ConfigurationManager.AppSettings["WatsonPath"];
            var username = ConfigurationManager.AppSettings["WatsonUsername"];
            var password = ConfigurationManager.AppSettings["WatsonPassword"];
            string credentials = Convert.ToBase64String(Encoding.ASCII.GetBytes(string.Format("{0}:{1}", username, password)));
            var values = new[]
                         { new KeyValuePair<string, string>("name", filename) };
            using (var client = new HttpClient())
            using (var formData = new MultipartFormDataContent())
            {
                client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", credentials);
                foreach (var keyValuePair in values)
                {
                    formData.Add(new StringContent(keyValuePair.Value), string.Format("'"{0}'"", keyValuePair.Key));
                }
                formData.Add(new ByteArrayContent(bytes),
                               '"' + "file" + '"',
                               '"' + filename + '"');
                var response = client.PostAsync(basePath + "/v1/dialogs", formData).Result;
                var result = response.Content.ReadAsStringAsync().Result;
                if (!response.IsSuccessStatusCode)
                {
                    var contentResult = new ContentResult
                    {
                        ContentType = "application/json",
                        Content = response.ReasonPhrase
                    };
                    return contentResult;
                }
                var successResult = new ContentResult
                {
                    ContentType = "application/json",
                    Content = result
                };
                return successResult;
            }
        }
        catch (Exception ex)
        {
            HandleError(ex);
            var contentResult = new ContentResult
            {
                ContentType = "application/json",
                Content = "false"
            };
            return contentResult;
        }
    }