尝试使用 C# 和 web-api 访问 Appian 文档
Attempting to access Appian documents using C# and web-api's
我正在尝试编写一个 C# 程序来将我的 Appian 案例与外部电子文档记录管理系统 (EDRMS) 集成。
该程序需要下载已在 Appian 中为每个案例上传的文档,然后确保使用网络服务将它们上传到 EDRMS。
我写了一个 Appian Web-api,我可以用它来登录并检索每个案例的文档列表,所以我知道我需要把文档放在 EDRMS 中的什么地方。
这些文档可以通过 URL [使用网络浏览器] 访问,如下所示:https://myappiansite.appiancloud.com/suite/doc/123456
如果我使用网络浏览器浏览到此 URL,它会立即下载该文件。
但是,如果我尝试从我的 C# 程序以编程方式连接到这个 url,当我[尝试] 打开文件流时,我得到的是一些 HTML 默认值着陆页而不是文档的内容。
我正在编写的代码如下所示:
HttpWebRequest MyRequest = (HttpWebRequest)WebRequest.Create("https://myappiansite.appiancloud.com/suite/doc/123456?signin=native");
MyRequest.Timeout = 10000; // 10 seconds
CredentialCache credentialCache = new CredentialCache();
credentialCache.Add(new System.Uri("https://myappiansite.appiancloud.com/suite/doc/123456?signin=native"),
"Basic",
new NetworkCredential("myAppianUsername",
"myAppainPassword"));
MyRequest.Credentials = credentialCache;
MyRequest.PreAuthenticate = true;
// Get the web response
HttpWebResponse MyResponse = (HttpWebResponse)MyRequest.GetResponse();
if (HttpStatusCode.OK == MyResponse.StatusCode)
{
int chunkSize = 524288;
using (FileStream fs = new FileStream("C:\temp\myNewFile.doc", FileMode.Create))
{
using (Stream MyResponseStream = MyResponse.GetResponseStream())
{
BinaryReader br = new BinaryReader(MyResponseStream);
byte[] data;
Boolean lastChunk = false;
do
{
data = br.ReadBytes(chunkSize);
if (data == null || data.Length == 0 || data.Length < chunkSize)
{
lastChunk = true;
}
if (data != null)
{
fs.Write(data, 0, data.Length);
}
}
while (!lastChunk);
br.Close();
}//using MyResponseStream
} // Using fs
}
但是当这段代码有 运行 时,文档 "C:\temp\myNewFile.doc" 只包含我们主登陆页面的 HTML。
有没有想过为什么浏览 https://myappiansite.appiancloud.com/suite/doc/123456 会下载文档,但上面的代码只是获取登录页面的 HTML?
[请注意,用户 "myAppianUsername" 是非 saml 用户,而通常情况下,用户会使用通过 SAML 连接到 AD 的帐户登录。如果我从 URL 中删除“?signin=native”,则下载的文件包含用于 SAML 登录的 HTML]
谢谢堆,
大卫.
我弄清楚了问题所在 - 事实证明,Appian 中内置了安全限制,不允许应用程序使用 url“https://myappiansite.appiancloud.com/suite/doc/123456”来下载文档。我必须创建一个单独的 web-api 来执行此操作。幸运的是,Appian 提供了一个文档下载 web-api template/wizard 可以为您生成 api.
因此,通过使用文档下载 web-api 向导生成一个名为 "DownloadMyFile" 的 web api,我能够使用未更改的代码,使用 web-api 的:
https://myappiansite.appiancloud.com/suite/webapi/DownloadMyFile/12345
我必须对其进行的唯一小调整是将额外的文档类型添加到其白名单中。
我正在尝试编写一个 C# 程序来将我的 Appian 案例与外部电子文档记录管理系统 (EDRMS) 集成。
该程序需要下载已在 Appian 中为每个案例上传的文档,然后确保使用网络服务将它们上传到 EDRMS。
我写了一个 Appian Web-api,我可以用它来登录并检索每个案例的文档列表,所以我知道我需要把文档放在 EDRMS 中的什么地方。
这些文档可以通过 URL [使用网络浏览器] 访问,如下所示:https://myappiansite.appiancloud.com/suite/doc/123456
如果我使用网络浏览器浏览到此 URL,它会立即下载该文件。
但是,如果我尝试从我的 C# 程序以编程方式连接到这个 url,当我[尝试] 打开文件流时,我得到的是一些 HTML 默认值着陆页而不是文档的内容。
我正在编写的代码如下所示:
HttpWebRequest MyRequest = (HttpWebRequest)WebRequest.Create("https://myappiansite.appiancloud.com/suite/doc/123456?signin=native");
MyRequest.Timeout = 10000; // 10 seconds
CredentialCache credentialCache = new CredentialCache();
credentialCache.Add(new System.Uri("https://myappiansite.appiancloud.com/suite/doc/123456?signin=native"),
"Basic",
new NetworkCredential("myAppianUsername",
"myAppainPassword"));
MyRequest.Credentials = credentialCache;
MyRequest.PreAuthenticate = true;
// Get the web response
HttpWebResponse MyResponse = (HttpWebResponse)MyRequest.GetResponse();
if (HttpStatusCode.OK == MyResponse.StatusCode)
{
int chunkSize = 524288;
using (FileStream fs = new FileStream("C:\temp\myNewFile.doc", FileMode.Create))
{
using (Stream MyResponseStream = MyResponse.GetResponseStream())
{
BinaryReader br = new BinaryReader(MyResponseStream);
byte[] data;
Boolean lastChunk = false;
do
{
data = br.ReadBytes(chunkSize);
if (data == null || data.Length == 0 || data.Length < chunkSize)
{
lastChunk = true;
}
if (data != null)
{
fs.Write(data, 0, data.Length);
}
}
while (!lastChunk);
br.Close();
}//using MyResponseStream
} // Using fs
}
但是当这段代码有 运行 时,文档 "C:\temp\myNewFile.doc" 只包含我们主登陆页面的 HTML。
有没有想过为什么浏览 https://myappiansite.appiancloud.com/suite/doc/123456 会下载文档,但上面的代码只是获取登录页面的 HTML?
[请注意,用户 "myAppianUsername" 是非 saml 用户,而通常情况下,用户会使用通过 SAML 连接到 AD 的帐户登录。如果我从 URL 中删除“?signin=native”,则下载的文件包含用于 SAML 登录的 HTML]
谢谢堆,
大卫.
我弄清楚了问题所在 - 事实证明,Appian 中内置了安全限制,不允许应用程序使用 url“https://myappiansite.appiancloud.com/suite/doc/123456”来下载文档。我必须创建一个单独的 web-api 来执行此操作。幸运的是,Appian 提供了一个文档下载 web-api template/wizard 可以为您生成 api.
因此,通过使用文档下载 web-api 向导生成一个名为 "DownloadMyFile" 的 web api,我能够使用未更改的代码,使用 web-api 的:
https://myappiansite.appiancloud.com/suite/webapi/DownloadMyFile/12345
我必须对其进行的唯一小调整是将额外的文档类型添加到其白名单中。