我正在调查文档,我不清楚在Microsoft Graph(v1.0参考)上的conversationThread和对话之间究竟有什么区别?
会话文档说明:会话是一组线程,一个线程包含该线程的帖子.对话中的所有主题和帖子都共享相同的主题.关系是线程.在这里,我假设同一主题意味着在那次谈话的保护伞下?
另一方面,conversationThread的文档声明:conversationThread是一组帖子.最后一个帖子的收件人集合是整个帖子的聚合收件人.线程可以拥有越来越多的收件人.从线程中删除收件人时会创建一个新线程.关系是帖子.这里不是一个线索,如果conversationThread是一个帖子的集合,那几乎与会话提供的一样?
我一直想做什么?我正在使用Fiddler来处理HTTP请求groups/<id>/conversations
,groups/<id>/threads
而且我注意到最明显的区别是threads
有一个isLocked
属性conversations
没有.然后问题出现在我的脑海里:"为什么以及在什么情况下我还会使用group/<id>/threads
它group/<id>/conversations
?".也许是因为我不理解conversationThread和会话之间的区别.
请记住,我是Microsoft Graph的新手,如果社区可以帮助我澄清这个问题,我真的很感激.
提前谢谢了!
编辑
使用Fiddler,我们设法创建了一个新线程.但是,不是按预期在指定的对话中创建新线程,而是创建一个新的对话以与新线程一起使用.A还尝试在新创建的线程中创建新帖子,但我面临以下错误:使用请求正文"不支持OData请求":"
{
"body": {
"contentType": "application/json",
"content": "This is a test"
}
}
"
我一直在努力使用我在Azure中设置的应用程序从Office 365访问计划数据.我已经能够成功检索许可和用户信息,但无法获得用户任务列表(来自Planner).
进一步澄清:
图文档:https://graph.microsoft.io/en-us/docs/api-reference/beta/api/user_list_tasks
该文档明确指出执行此操作所需的范围是Group.ReadWrite.All AND Tasks.ReadWrite,我已经提供给应用程序(以及大量其他权限,因为我变得绝望和恼火).对于下面列出的每个应用程序,将检查所有应用程序权限和所有委托权限.在我开始工作之后,我将删除必要的,但我认为这将有助于缓解"你有没有尝试过检查这个...或那个......回复"
我意识到这是测试版,但希望能够利用它,并认为也许别人有更好的运气.
我尝试通过以下两种方式形成请求: https : //graph.microsoft.com/beta/users/[username]/plans https://graph.microsoft.com/beta/tasks?$ filter = createdBy eq '[用户名]'
两者都产生以下结果(大部分消息由于长度而被删除):
{ error:
{ code: 'UnknownError',
message: '...<h2>401 - Unauthorized: Access is denied due to invalid credentials.</h2>\r\n <h3>You do not have permission to view this directory or page using the credentials that you supplied.</h3>...',
innerError:
{ 'request-id': '09ef3a04-7fc2-48a0-9570-7f04171e45ed',
date: '2016-05-11T14:18:12' } } }
Run Code Online (Sandbox Code Playgroud) 我正在为公司试用Azure AD B2B功能。我试图通过门户并使用https://graph.microsoft.com/beta/invitations邀请外部用户。在两种情况下,都成功地邀请了用户并将其添加到我们的目录中。登录适用于社交帐户(然后使用Microsoft帐户)。如果它是一个非社交帐户(又名contoso.com),并且以前没有Azure AD,则当我们的应用程序尝试登录用户时,我会得到一个access_denied。如果我尝试强制达成同意流程,则会收到以下消息:
AADSTS65005:您的公司aaa.no当前不支持应用程序zzz。您的公司目前处于不受管理的状态,需要管理员通过aaa.no的DNS验证来声明对公司的所有权,然后才能配置应用程序zzz。
我们有许多小型公司作为客户,似乎它们在用户使用我们的应用程序之前都必须对Azure AD目录进行管理似乎是不合理的。根据微软的说法,它应该是无缝的:
无缝:需要访问您的公司应用程序的合作伙伴公司不需要Azure AD。Azure AD B2B协作提供了简单的用户注册体验,使这些合作伙伴可以立即访问您的应用程序。
如果他们可以注册并创建他们的用户和目录,为什么他们不能让他们被邀请的应用程序同意登录(该应用程序需要登录并读取用户配置文件委托权限)?
我们已经允许拥有自己的托管Azure AD的公司在我们的应用程序中使用其用户。我们获得了全球管理员的同意,以便管理员同意我们的应用程序,以便他们可以登录用户并读取目录数据。这些用户未添加到我们的目录中,并且可以正常工作。
另外,如果我以受邀用户的身份转到新门户,则可以看到域aaa.no已验证,但是无法将其设置为主域。
我尝试过的其他方法不起作用:升级到最新的ADAL版本,尝试在https://apps.dev.microsoft.com中创建应用程序并使用它,尝试在旧的Azure门户中设置权限(似乎是一个错误在清单中未显示权限的新门户中),并尝试使该应用程序成为单租户。没用。
图谱API分页说明响应将包含一个字段@odata.nextLink
,该字段将包含skiptoken
指向下一页内容的字段.
当我测试API时,我得到一个完全限定的MS Graph URL,其中包含skiptoken
作为查询参数.例如,下面是我@odata.nextLink
在响应JSON中为该字段获得的值.
https://graph.microsoft.com/v1.0/users?$top=25&$skiptoken=X%27445370740200001E3A757365723134406F33363561702E6F6E6D6963726F736F66742E636F6D29557365725F31363064343831382D343162382D343961372D383063642D653136636561303437343437001E3A7573657235407368616C696E692D746573742E31626F74322E696E666F29557365725F62666639356437612D333764632D343266652D386335632D373639616534303233396166B900000000000000000000%27
假设我们总是得到完整的URL而不仅仅是skiptoken
?因为如果它是真的,它有助于避免解析skiptoken
然后将其连接到现有URL以自己形成完整的URL.
编辑 - 与MS Graph API相比,从Azure AD Graph API获得的响应的不同之处在于JSON字段@odata.nextLink
仅包含skipToken
而不包含完全限定的URL.
我正在尝试连接到Azure AD,我正在使用此代码.
try
{
var clientCredential = new ClientCredential(_clientId, _clientSecret);
var authContext = new AuthenticationContext(AuthUri + _tenant);
var authResult = await authContext.AcquireTokenAsync(GraphUri,clientCredential);
var authString = authResult.CreateAuthorizationHeader();
var client = new HttpClient();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var request = new HttpRequestMessage
{
Method = HttpMethod.Get,
RequestUri = _requestUri,
};
request.Headers.Add("Authorization", authString);
HttpResponseMessage response = null;
await client.SendAsync(request).ContinueWith(taskWithMessage =>
{
response = taskWithMessage.Result;
});
return await response.Content.ReadAsStringAsync();
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
Run Code Online (Sandbox Code Playgroud)
我不明白的一个大问题是,当执行到达第一个await(var authResult = await authContext.AcquireTokenAsync(GraphUri,clientCredential);
)时,该进程被简单地杀死.没有例外,没有.
如果我替换该行
var authResult …
Run Code Online (Sandbox Code Playgroud) c# asynchronous async-await azure-active-directory microsoft-graph
此问题是通过Microsoft Graph在Outlook加载项中获取自定义属性集的后续操作。
我的Outlook Office.js加载项正在向事件添加一些自定义属性。它可以按预期工作,我可以使用Microsoft Graph并按照以下GET
请求访问这些属性:
/v1.0/me/events/{event-id}?$expand=SingleValueExtendedProperties($filter=id%20eq%20'String%20{00020329-0000-0000-C000-000000000046}%20Name%20cecp-b7ff386a-234a-4a38-84bc-e5ae4684b7af')
Run Code Online (Sandbox Code Playgroud)
但现在,我尝试通过将这样的正文发布到推送通知端点(/v1.0/subscriptions
)来订阅推送通知:
{
changeType: "created,updated,deleted",
notificationUrl: `[...my url...]`,
resource: `/users/${userData.id}/events?$filter=singleValueExtendedProperties/any(ep%3A%20ep%2Fid%20eq%20'String%20{00020329-0000-0000-C000-000000000046}%20Name%20cecp-b7ff386a-234a-4a38-84bc-e5ae4684b7af')`,
expirationDateTime: tomorrow,
clientState: "SecretClientState"
}
Run Code Online (Sandbox Code Playgroud)
但我得到:
{
"error": {
"code": "ExtensionError",
"message": "Operation: Create; Exception: [Status Code: BadRequest; Reason: Bad Request]",
"innerError": {
"request-id": "01dcece6-0103-4bef-8231-e9ab9480402a",
"date": "2017-04-04T20:20:58"
}
}
}
Run Code Online (Sandbox Code Playgroud)
试图设置请求中的资源为不转义,但结果相同,接下来我尝试的是$filter
功能,因此使用MS Graph资源管理器以以下格式获取了get请求:
/v1.0/me/events/?$filter=singleValueExtendedProperties/any(ep%3A%20ep%2Fid%20eq%20'String%20{00020329-0000-0000-C000-000000000046}%20Name%20cecp-b7ff386a-234a-4a38-84bc-e5ae4684b7af')
Run Code Online (Sandbox Code Playgroud)
但出现以下错误:
{
"error": {
"code": "ErrorInvalidUrlQueryFilter",
"message": "The filter expression for $filter does not match to a single extended property and a value restriction.", …
Run Code Online (Sandbox Code Playgroud) outlook-restapi office-js outlook-web-addins microsoft-graph
为此,我使用Graph api如下,
var settings = {
"async": true,
"crossDomain": true,
"url": "https://graph.microsoft.com/beta/sharepoint/sites",
"method": "GET",
"headers": {
"authorization": "Bearer token",
"cache-control": "no-cache",
"postman-token": "3116b007-e574-5ad4-aedd-3b35fbf76b61"
}
}
$.ajax(settings).done(function (response) {
console.log(response);
});
Run Code Online (Sandbox Code Playgroud)
但它输出如下,
{
"@odata.context": "https://graph.microsoft.com/beta/$metadata#sharePoint/sites",
"value": [
{
"createdDateTime": "2017-02-18T13:03:01.263Z",
"description": "",
"id": "2422c3a2-3c51-40f1-8483-5454aead43c4,412bb897-c754-460a-962d-db22893a1649",
"lastModifiedDateTime": "2017-04-24T02:16:43Z",
"name": "",
"webUrl": "https://mps330124.sharepoint.com",
"root": {},
"siteCollection": {
"hostname": "mps330124.sharepoint.com"
},
"siteCollectionId": "2422c3a2-3c51-40f1-8483-5454aead43c4",
"siteId": "412bb897-c754-460a-962d-db22893a1649"
}
]
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能实现它使用graph api beta
我正在使用Microsoft.Graph
nuget软件包(版本1.6.2),并且尝试将电子邮件标记为已读。这是代码:
msg.IsRead = true;
await MainPage.GraphServiceClient.Me.Messages[msg.Id].Request().Select("IsRead").UpdateAsync(msg);
Run Code Online (Sandbox Code Playgroud)
据我了解,以上代码仅应将该IsRead
属性发送到服务器以进行更新。但是,执行此操作后,将发送整个消息对象(我已经使用Fiddler进行了验证),您将收到以下响应:
{
"error": {
"code": "ErrorInvalidPropertyUpdateSentMessage",
"message": "Update operation is invalid for property of a sent message.",
"innerError": {
"request-id": "<A guid here that I wont share>",
"date": "2017-07-29T21:10:18"
}
}
}
Run Code Online (Sandbox Code Playgroud)
代码正确吗,这是一个错误,我是否缺少某些内容或内容?有没有解决的办法?
我试图弄清楚如何使用Microsoft Graph JavaScript Client创建日历事件。
我已经设法检索了必要的内容,accessToken
并且可以与API进行交互(即检索事件,日历,前10名电子邮件),但是我不确定如何使用API创建事件。
client
.api('/me/events')
.header('X-AnchorMailbox', emailAddress)
Run Code Online (Sandbox Code Playgroud)
我是否使用post发送事件json对象?
以下是我在Azure AD中邀请用户使用的代码。
我收到“未经授权”的回复。我不确定缺少哪些权限/设置。有谁有主意。
string accessToken = await AuthenticationHelper.GetTokenForApplication ();
InvitationModel invite = new InvitationModel ();
invite.invitedUserEmailAddress = user.Email;
invite.inviteRedirectUrl = ConfigurationManager.AppSettings["InviteRedirectUrl"];
invite.sendInvitationMessage = true;
using (HttpClient client = new HttpClient ()) {
client.BaseAddress = new Uri ("https://graph.microsoft.com");
client.DefaultRequestHeaders.Accept.Add (
new MediaTypeWithQualityHeaderValue ("application/json"));
client.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue ("Bearer", accessToken);
HttpResponseMessage response =
client.PostAsJsonAsync<InvitationModel> ("v1.6/invitations", invite).Result;
dynamic inviteResult =
response.Content.ReadAsAsync<dynamic> ().Result;
if (inviteResult.status != "Error") { }
}
Run Code Online (Sandbox Code Playgroud) microsoft-graph ×10
office365 ×2
outlook ×2
.net ×1
adal ×1
async-await ×1
asynchronous ×1
c# ×1
email ×1
graph ×1
office-js ×1
office365api ×1
pagination ×1
sharepoint ×1