标签: microsoft-dynamics-webapi

通过API为Microsoft Dynamics CRM中的联系人实体创建注释

此问题与我通过API调用的Microsoft Dynamics CRM 2015有关.

我创建联系实体:

POST [organization URI]/api/data/contacts
Content-Type: application/json; charset=utf-8
Accept: application/json
{
    "emailaddress1": "myemail@example.com",
}
Run Code Online (Sandbox Code Playgroud)

登录面板后,我看到了新的记录.我可以通过API调用它:

[organization URI]/api/data/contacts(f76e4e7c-ea61-e511-80fd-3863bb342b00)
{
  "@odata.context":"[organization URI]/api/data/$metadata#contacts/$entity",
  "@odata.etag":"W/\"460199\"",
  ...
  "contactid":"f76e4e7c-ea61-e511-80fd-3863bb342b00",
  "emailaddress1":"myemail@example.com",
  ....
}
Run Code Online (Sandbox Code Playgroud)

我想做的下一件事是添加与该联系人关联的注释记录.按照指南我打电话:

POST [organization URI]/api/data/annotations
Content-Type: application/json; charset=utf-8
Accept: application/json
{
    "notetext": "TEST",
    'contact@odata.bind': 'contacts(f76e4e7c-ea61-e511-80fd-3863bb342b00)'
}
Run Code Online (Sandbox Code Playgroud)

但它返回400错误:

未声明的属性"contact",其在有效内容中仅包含属性注释,但在有效内容中未找到属性值.在OData中,只有声明的导航属性和声明的命名流可以表示为没有值的属性.

我打电话的时候:

POST [organization URI]/api/data/annotations
Content-Type: application/json; charset=utf-8
Accept: application/json
{
    "notetext": "TEST",
}
Run Code Online (Sandbox Code Playgroud)

创建了新实体,但没有与联系人的关系.

如何正确撰写此POST请求?我在这里错过了什么?我猜想,那contact@odata.bind应该呈现有些不同,我试过contactid@odata.bind,object@odata.bind,objectid@odata.bind-但没有效果.

有任何想法吗?

microsoft-dynamics dynamics-crm odata dynamics-crm-webapi microsoft-dynamics-webapi

17
推荐指数
4
解决办法
1万
查看次数

使用Dynamics CRM Web API创建帖子

无法使用Dynamics CRM 2016 Online Web API创建Post实体(https://msdn.microsoft.com/en-us/library/mt607553.aspx).

此有效负载应创建一个帖子 POST /api/data/v8.1/posts

{
    "text": "Test Single Post",
    "source": 1,
    "type": 7
}
Run Code Online (Sandbox Code Playgroud)

(来源1是自动发布,类型7是状态发布)

但它返回:

{
    "error":
    {
        "code":"",
        "message":"An unexpected error occurred.",
        "innererror"
        {
            "message":"An unexpected error occurred..."
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

仅使用"text"提交相同的有效负载也会失败.

请注意,Post实体没有单值导航属性(https://msdn.microsoft.com/en-us/library/mt607553.aspx#bkmk_SingleValuedNavigationProperties),这将允许我设置相关实体​​(联系人,帐户,等等).

例如,创建任务实体(https://msdn.microsoft.com/en-us/library/mt607619.aspx)可以正常工作POST /api/data/v8.1/tasks

{
    "subject": "Test Single Task",
    "description": "Test One Description of Task",
    "regardingobjectid_contact_task@odata.bind": "/contacts(<someguid>)",
    "scheduledend": "2016-07-21T12:11:19.4875892Z"
}
Run Code Online (Sandbox Code Playgroud)

在我看来,Post应该暴露类似的东西regardingobjectid_contact_post@odata.bind,但事实并非如此.

对于上下文,这是通过SOAP端点和SDK创建Post的方法:

var result = Client.getOrganizationService().Create(new Post
{
    Text = post.text,
    RegardingObjectId = …
Run Code Online (Sandbox Code Playgroud)

dynamics-crm odata dynamics-crm-online dynamics-crm-webapi microsoft-dynamics-webapi

6
推荐指数
1
解决办法
1343
查看次数

从Dynamics CRM API返回什么DateTime

从Dynamics CRM Web API返回的DateTime对象是否始终以UTC格式记录?

我正在使用CRM SDK nuget包.我已经阅读了几个博客(由CRM商店),CRM API总是返回UTC DateTime对象,我经历过DateTime.Kind总是UTC(来自我的测试),但我需要确定.

如果重要的话,CRM是2015年.

我使用以下代码调用Dynamics CRM Web服务.

 var querybyattribute = new QueryByAttribute()
 {
     EntityName = Opportunity.EntityLogicalName,
     ColumnSet = new ColumnSet(true)//all columns
 };

querybyattribute.Attributes.AddRange(attributeName);
querybyattribute.Values.AddRange(attributeValue);
Run Code Online (Sandbox Code Playgroud)

然后调用RetreiveMultiple

EntityCollection entities;
using (var proxy = new ManagedTokenOrganizationServiceProxy(serviceManagement, credentials))
{
    entities = proxy.RetrieveMultiple(query);
}
Run Code Online (Sandbox Code Playgroud)

c# dynamics-crm microsoft-dynamics-webapi

5
推荐指数
1
解决办法
2579
查看次数

在 C# 插件中调用 Dynamics Web API

我在 Microsoft Dynamics 中有一个业务流程来处理新客户端的创建。当该过程完成时,我附加了一个工作流,该工作流启动一个调用插件来执行一些自定义处理的操作。我正在关注这篇文章来设置这个过程。

在我的插件中,我调用了 Dynamics Web API(参见下面的代码)。当我上responseMessage = client.GetAsync(url).Result;线时,我的插件退出而不返回错误。当我在插件注册工具中调试时,插件注册工具崩溃并且必须重新启动。当我查看网络流量时,此调用似乎因401 - Unauthorized错误而失败。

当我HttpClient从控制台应用程序尝试相同的调用时,调用成功。我尝试了几种不同的身份验证凭据,但没有成功。我还尝试GetAsync以几种不同的方式调用该函数。此错误与异步或身份验证方法有关吗?我在这里缺少什么?

HttpClient client = new HttpClient(new HttpClientHandler() { Credentials = new NetworkCredential("admin", "password", "DOMAIN") });
client.BaseAddress = new Uri(Helpers.GetSystemUrl(COHEN.APIConnector.Application.Dynamics));
client.DefaultRequestHeaders.Clear();
client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
client.DefaultRequestHeaders.Add("OData-MaxVersion", "4.0");
client.DefaultRequestHeaders.Add("OData-Version", "4.0");
HttpResponseMessage responseMessage;
string url = "ccseq_clients";

responseMessage = client.GetAsync(url).Result;
Run Code Online (Sandbox Code Playgroud)

更新

我们正在使用 Dynamics 2016 On-Premise。

我们使用 Web API 的原因是这个调用发生在我们开发的一个库中,该库将在多个系统之间进行接口。该库在插件内使用,但也可以在插件外用于其他应用程序。我们提供的代码示例是库中失败的代码块。我们将代码块直接拉入插件中,以查看错误是否与库或插件相关。

我们注意到 client.GetAsync(url).Resultcall 实际上返回了一个正确的值。我们错过了在我们的网络流量中看到在第三次成功之前两次调用失败并返回正确值的情况(见下面的截图)。奇怪的是,当我们调试这行代码时,越过这行代码导致插件注册工具崩溃,而网络流量显示我们返回了正确的值。如果我们在这行代码之后设置一个断点,那么插件注册工具就不会崩溃并且我们的响应中有一个正确的值。当我们回到库中调试而不是直接在插件中调试时,这种行为发生了变化。在库中,即使网络流量仍然显示成功响应,无论我们在何处设置断点,插件注册工具在点击此行时总是崩溃。

网络流量


更新 2

看起来我的库成功地对 Web API 进行了多次不同的调用,所以我认为问题更多的是插件注册工具无法处理 Web API 调用,而不是调用实际上不起作用。

网络流量

c# microsoft-dynamics asynchronous dynamics-crm microsoft-dynamics-webapi

5
推荐指数
1
解决办法
1545
查看次数

将角色与用户关联Microsoft Dynamics CRM(Rest API)

我有用例,我需要创建角色,在crm实例中创建用户并将角色与用户相关联。

我已经探索了用于创建用户和创建角色的api。

下面是代码:

private void createUser(IntegrationUserDTO integrationUserDTO, STSDto stsDetails, CRMAuthContext crmAuthContext)
            throws IntegrationsException {
        Map<String, Object> requestBody = new HashMap<>();
        URI uri = new MSCRMHttpDelegate().odataUriBuilder(crmAuthContext.getCrmApiUrl())
                .appendEntitySetSegment("systemusers").build();
        HttpPost httpPost = new HttpPost(uri.toString());
        httpPost.setHeader("Authorization", "Bearer " + crmAuthContext.getAccessToken());
        httpPost.setHeader("Accept", MediaType.APPLICATION_JSON);
        httpPost.setHeader("OData-MaxVersion", "4.0");
        httpPost.setHeader("OData-Version", "4.0");
        httpPost.setHeader("Content-Type", "application/json");

        requestBody.put("accessmode", "4");
        requestBody.put("applicationid", UUID.fromString(stsDetails.getClientId()));
        requestBody.put("firstname", integrationUserDTO.getUsername());
        requestBody.put("lastname", integrationUserDTO.getSecretToken());
        requestBody.put("internalemailaddress", integrationUserDTO.getExtraParams());
        requestBody.put("isintegrationuser", true);
        MSCRMUser user = getBusinessUnitId(crmAuthContext);

        if (StringUtils.isNoneBlank(user.getBusinessUnitId())) {
            requestBody.put("businessunitid@odata.bind",
                    "/businessunits(" + UUID.fromString(user.getBusinessUnitId()) + ")");
        }

        if (StringUtils.isNoneBlank(user.getOrganizationId())) {
            requestBody.put("organizationid", UUID.fromString(user.getOrganizationId()));
        }

        try {
            httpPost.setEntity(new StringEntity( …
Run Code Online (Sandbox Code Playgroud)

java microsoft-dynamics dynamics-crm dynamics-crm-online microsoft-dynamics-webapi

2
推荐指数
1
解决办法
729
查看次数