标签: dynamics-crm-webapi

如何通过odata冒充用户

我们在2016年使用odata v8.1端点成功模仿用户.

请注意,预期的请求流程是:邮递员 - > LocalHost微服务 - > CRM

来自Postman的工作请求示例- > CRM (直接,无需通过微服务)

Accept:application/json
Content-Type:application/json; charset=utf-8
OData-MaxVersion:4.0
OData-Version:4.0
MSCRMCallerID:d994d6ff-5531-e711-9422-00155dc0d345
Cache-Control:no-cache
Run Code Online (Sandbox Code Playgroud)

反对odata终点: ..../api/data/v8.1/leads

请注意,仅当通过邮递员直接针对odata v8.1端点发出此选项时才会成功.

当试图做同样的事情,让本地运行的服务(邮差 - > LocalHost服务 - > CRM),这失败了,只是忽略??? MSCRMCallerID标头.

在检查从Postman传递给LocalHost微服务的头时,请求,由VS 2017中的调试器检查:

{Method: POST, RequestUri: 'https://.../api/data/v8.1/leads', Version: 1.1, Content: System.Net.Http.StringContent, Headers:
{
  OData-Version: 4.0
  OData-MaxVersion: 4.0
  MSCRMCallerID: D994D6FF-5531-E711-9422-00155DC0D345
  Cache-Control: no-cache
  Accept: application/json
  Content-Type: application/json; charset=utf-8
}}
Run Code Online (Sandbox Code Playgroud)

记录是成功创建的,但是在CreatedBy字段上是服务用户名而不是MSCRMCallerID用户名(d994d6ff-5531-e711-9422-00155dc0d345),并且CreatedOnBehalf字段为空.

我们做错了什么?

我们如何通过我们的服务来模拟这种模仿?

编辑+更多信息

请注意,我相信我已经包含了所有相关信息,但如果我没有,请告诉我在此问题上应该提供的其他输入.

我试过了什么?

  1. 改变了标题的顺序
  2. 玩标题的情况下
  3. 确保guid对用户进行冒充是正确的
  4. 确保用户同时具有委托和系统管理员角色(尽管这是无关紧要的,因为这在直接针对crm odata端点执行请求时起作用,而不是我们的服务公开的端点
  5. 试图对https和http执行请求 …

c# dynamics-crm azure-service-fabric dynamics-crm-2016 dynamics-crm-webapi

19
推荐指数
1
解决办法
1071
查看次数

通过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万
查看次数

CRM16 - 从WebApi触发自定义操作

我在CRM中构建了一个自定义操作,我需要通过它的WebAPI来解决这个问题.自定义操作已激活,我在创建CRM时没有出现任何错误.

在此输入图像描述

我尝试从VB.NET应用程序调用此操作,如:

Dim httpch As New HttpClientHandler
Dim requestUri As String = "contacts(1fcfd54a-15d3-e611-80dc-0050569ea396)/Microsoft.Dynamics.CRM.new_addnotetocontact"
httpch.Credentials = New NetworkCredential("username", "password", "domain")
Dim httpClient As New HttpClient(httpch)
httpClient.BaseAddress = New Uri(CRMWebApiUri)
httpClient.Timeout = New TimeSpan(0, 2, 0)
httpClient.DefaultRequestHeaders.Add("OData-MaxVersion", "4.0")
httpClient.DefaultRequestHeaders.Add("OData-Version", "4.0")
httpClient.DefaultRequestHeaders.Add("Prefer", "odata.include-annotations='OData.Community.Display.V1.FormattedValue'")
httpClient.DefaultRequestHeaders.Accept.Add(New MediaTypeWithQualityHeaderValue("application/json"))
Dim jsonNote As JObject = New JObject(New JProperty("NoteTitle", "'Mails have been deleted'"), New JProperty("NoteText", "This contacts SmarterMail data has been deleted due to inactivity"))
Dim postData = New StringContent(jsonNote.ToString(), Encoding.UTF8, "application/json")

Dim retrieveContactResponse As HttpResponseMessage = httpClient.PostAsync(requestUri, postData).Result …
Run Code Online (Sandbox Code Playgroud)

vb.net crm dynamics-crm asp.net-web-api dynamics-crm-webapi

10
推荐指数
2
解决办法
1105
查看次数

在新窗口中打开Web资源中使用Xrm.WebApi方法

我使用以下命令在新窗口中打开了一个HTML Web资源:

Xrm.Navigation.openWebResource(webResource, windowOptions, data);

这是一个HTML Web资源,它正在加载ClientObject

<script type="text/javascript" src="../../../ClientGlobalContext.js.aspx" ></script>

然后我有一些试图检索的JavaScript Contact

var contactId = "8553DA63-11C9-E711-A824-000D3AE0CB84";
var promise = Xrm.WebApi.retrieveRecord("contact", contactId, "$select=contactid,firstname,lastname");`
Run Code Online (Sandbox Code Playgroud)

但这是失败的.我已逐步跟踪到该Xrm.WebApi方法,并发现错误是在它尝试解析"contact"为a时Set Name

来自Global.ashx的代码

getEntitySetName: function(logicalName) {
    Mscrm.Utilities.addTelemetryLog("Xrm.Utility.getEntitySetName");
    var $v_0 = window.ENTITY_SET_NAMES || window.top.ENTITY_SET_NAMES;
    if (IsNull(this.$5H_1) && !isNullOrEmptyString($v_0))
        this.$5H_1 = JSON.parse($v_0);
    return this.$5H_1[logicalName.toLowerCase()]
},
Run Code Online (Sandbox Code Playgroud)

由于某种原因,该window.ENTITY_SET_NAMES对象为null,因此发生错误(空引用)

我已经尝试将我的Web资源嵌入到CRM页面中,并且代码可以正常工作.问题似乎是通过网络资源启动时 Xrm.Navigation.openWebResource

有没有人试图Xrm.WebApi在打开的网络资源的上下文中使用Xrm.Navigation.openWebResource?或者是否有人知道检索数据是否还需要其他步骤?


更新

ENTITY_SET_NAMES初始化main.aspx.我尝试将我的自定义Web资源直接嵌入到新的Main Form部分,该retrieveRecord方法可行.

只有在通过新页面运行Web资源时,这才会出现问题 Xrm.Navigation.openWebResource


更新2 - 对Aron的回应 …

javascript microsoft-dynamics dynamics-crm dynamics-crm-webapi dynamics-365

8
推荐指数
2
解决办法
2534
查看次数

CRM不支持直接更新实体引用属性,而是使用导航属性

我正在使用Dynamic Web Api和Simple OData.我需要为链接实体添加新记录.

我使用下面的代码片段并参考https://github.com/object/Simple.OData.Client/wiki/Adding-entries-with-links上的文档

       var newContactData = await _oDataClient
            .For<Contacts>()
               .Set(new
               {
                   firstname = contactData.ContatDetails.firstname,
                   lastname = contactData.ContatDetails.lastname,
                   emailaddress1 = contactData.ContatDetails.emailaddress1
               })
               .InsertEntryAsync(true);

        var newContactLink = await  _oDataClient.For<New_project_contactses>()
                .Set(new
                {
                    _new_contact_project_name_new_value = contactData.ContatDetailsLink._new_contact_project_name_new_value,
                    new_project_contactsid = new Guid("0eb46b24-21a2-e611-80eb-c4346bc5b2d4"),
                    new_contact_type = contactData.ContatDetailsLink.new_contact_type,

                })
                .InsertEntryAsync(resultRequired: true);
Run Code Online (Sandbox Code Playgroud)

我正在例外

CRM不支持直接更新实体引用属性,而是使用导航属性代替S.

dynamics-crm simple.odata simple.odata.client dynamics-crm-webapi

7
推荐指数
2
解决办法
4450
查看次数

创建价格水平时无法创建产品价格水平

我正在尝试通过api在Dynamics CRM中创建价格级别对象。

在创建价格水平对象(价格列表)时,我还想创建带有所谓的深层插入但至今没有成功的产品价格水平(价格列表项目)。

我正在遵循指南。

这是价格级别实体类型的链接

产品价格水平具有集合值的导航属性,称为price_level_product_price_levels

如果我遵循本教程,则需要撰写以下请求

[POST] /pricelevels
Run Code Online (Sandbox Code Playgroud)

授权标头设置正确,内容主体为:

{
    "name": "MA - 2019W24",
    "paymentmethodcode": 1,
    "price_level_product_price_levels": [{
            "quantitysellingcode": 1,
            "amount": 89,
            "amount_base": 89,
            "pricingmethodcode": 1,
            "productid@odata.bind": "/products(ef43bf1f-e605-e911-a818-000d3a2cd4e8)",
            "uomid@odata.bind": "/uoms(942b3c4c-e405-e911-a818-000d3a2cd4e8)"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

响应中的错误消息是:

具有ID的价格级别= c0184273-ed8c-e911-a83b-000d3a2dd73b不存在

UUID随每个请求而变化。响应中包含的stacktrace为:

at Microsoft.Crm.Extensibility.OrganizationSdkServiceInternal.CreateInternal(Entity entity, InvocationContext invocationContext, CallerOriginToken callerOriginToken, WebServiceType serviceType, Boolean checkAdminMode, Dictionary`2 optionalParameters)
at Microsoft.Crm.Extensibility.OData.CrmODataExecutionContext.CreateOrganizationResponse(Entity entity)
at Microsoft.Crm.Extensibility.OData.CrmODataServiceDataProvider.CreateEdmEntity(CrmODataExecutionContext context, String edmEntityName, EdmEntityObject entityObject, Boolean isUpsert)
at Microsoft.Crm.Extensibility.OData.EntityController.PostEntitySetImplementation(String& entitySetName, EdmEntityObject entityObject)
at Microsoft.PowerApps.CoreFramework.ActivityLoggerExtensions.Execute[TResult](ILogger logger, EventId eventId, ActivityType activityType, …
Run Code Online (Sandbox Code Playgroud)

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

7
推荐指数
1
解决办法
348
查看次数

CRM 2016 oData扩展了集合

我正在尝试从新的REST API中检索多个数据,但我有一个奇怪的问题.如果我在集合上使用$ expand,那么它就不起作用.

请求是:

GET [Oranization URL]/api/data/v8.0/accounts?$expand=contact_customer_accounts HTTP/1.1
Accept: application/json
Content-Type: application/json; charset=utf-8
OData-MaxVersion: 4.0
OData-Version: 4.0
Run Code Online (Sandbox Code Playgroud)

并回应:

{
"error": {
    "code": "",
    "message": "Expansion of navigation properties isn\u2019t supported on entity collections.",
    "innererror": {
        "message": "Expansion of navigation properties isn\u2019t supported on entity collections.",
        "type": "Microsoft.Crm.CrmHttpException",
        "stacktrace": "   at Microsoft.Crm.Extensibility.OData.CrmODataUtilities.ThrowIfSelectClauseHasNavigationProperty(SelectExpandClause selectExpandClause, Boolean isCalledFromEntitySet)\r\n   at Microsoft.Crm.Extensibility.OData.CrmODataServiceDataProvider.RetrieveEdmEntityCollection(CrmODataExecutionContext context, String entityCollectionName, ODataQueryOptions queryOptions)\r\n   at Microsoft.Crm.Extensibility.OData.EntityController.GetEntitySetInternal(String entitySetName, String castEntityName, CrmODataExecutionContext context, CrmEdmEntityObjectCollection crmEdmEntityObjectCollection, ODataQueryOptions queryOptions)\r\n   at Microsoft.Crm.Extensibility.OData.EntityController.GetEntitySet(String entitySetName)\r\n   at lambda_method(Closure , …
Run Code Online (Sandbox Code Playgroud)

crm odata dynamics-crm-online dynamics-crm-2016 dynamics-crm-webapi

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

使用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
查看次数

如何使用PHP在Dynamics 365中添加新联系人

在一个Joomla应用程序我得到一个用户信息如下,然后我需要保存用户信息通过自己的REST API的动态365数据库中的联系人.

                    $user = JFactory::getUser();
                    $username = $user->username;
                    $name = $user->name;
Run Code Online (Sandbox Code Playgroud)

我环顾周围的Web API和REST API像动态文档这个这个,但他们没有提供有用的信息,我怎么能调用API来添加新的联系人.:目前,我通过这个网址连接365动态Web应用程序http://example.com:8088/mysite/api/data/v8.2.链接的帖子也讨论了REST API,但只是查询.我正在寻找一种使用REST API将数据发布到Dynamics CRM的方法.

php joomla microsoft-dynamics dynamics-crm dynamics-crm-webapi

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

如何从 Javascript 调用操作 Microsoft Dynamics

我需要从 Javascript 调用操作流程。我的操作接受 2 个输入参数和 1 个输出参数。下面是我的Action的截图

在此输入图像描述 我的表单中有一个文本字段,在其onChange事件中我调用此 CallAction 方法。下面是 JavaScript

function CallAction() {

        var actionName = "taqi_getPrice";
        var actionParameters = {
            "base": "USD",
            "TotalPrice": "200"
        };
        var actionResponse = activateCustomAction(actionName, actionParameters);
    }
    function activateCustomAction(actionName, actionParams) {

        var req = new XMLHttpRequest();
        req.open("POST", Xrm.Page.context.getClientUrl() + "/api/data/v9.0/taqi_getPrice", false);
        req.setRequestHeader("OData-MaxVersion", "4.0");

        req.setRequestHeader("OData-Version", "4.0");
        req.setRequestHeader("Accept", "application/json");
        req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
        req.onreadystatechange = function () {
            if (this.readyState === 4) {
                req.onreadystatechange = null;
                if (this.status === 200) {
                    var results = JSON.parse(this.response); …
Run Code Online (Sandbox Code Playgroud)

javascript microsoft-dynamics action dynamics-crm dynamics-crm-webapi

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