Skip to content

Commit 0a036ed

Browse files
author
Release-Agent
committed
''
1 parent 3af97c1 commit 0a036ed

File tree

7 files changed

+115
-48
lines changed

7 files changed

+115
-48
lines changed

src/GeneralTools/DataverseClient/Client/ConnectionService.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2380,7 +2380,7 @@ internal async Task<HttpResponseMessage> Command_WebExecuteAsync(string queryStr
23802380
retry = ShouldRetryWebAPI(ex, retryCount, maxRetryCount, retryPauseTime, out isThrottled);
23812381
if (retry)
23822382
{
2383-
Utilities.RetryRequest(null, requestTrackingId, TimeSpan.Zero, logDt, logEntry, SessionTrackingId, disableConnectionLocking, _retryPauseTimeRunning, ex, errorStringCheck, ref retryCount, isThrottled, webUriReq: $"{method} {queryString}");
2383+
retryCount = await Utilities.RetryRequest(null, requestTrackingId, TimeSpan.Zero, logDt, logEntry, SessionTrackingId, disableConnectionLocking, _retryPauseTimeRunning, ex, errorStringCheck, retryCount, isThrottled, webUriReq: $"{method} {queryString}").ConfigureAwait(false);
23842384
}
23852385
else
23862386
{
Lines changed: 44 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,55 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

3-
<PropertyGroup>
4-
<RootNamespace>Microsoft.PowerPlatform.Dataverse.Client</RootNamespace>
5-
<ComponentAreaName>DataverseClient</ComponentAreaName>
6-
<SignAssembly>true</SignAssembly>
7-
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
8-
</PropertyGroup>
9-
<Import Project="..\..\..\Build.Common.core.props" />
3+
<PropertyGroup>
4+
<RootNamespace>Microsoft.PowerPlatform.Dataverse.Client</RootNamespace>
5+
<ComponentAreaName>DataverseClient</ComponentAreaName>
6+
<SignAssembly>true</SignAssembly>
7+
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
8+
</PropertyGroup>
9+
<Import Project="..\..\..\Build.Common.core.props" />
1010

11-
<PropertyGroup>
12-
<GeneratePackageOnBuild>false</GeneratePackageOnBuild>
13-
<DocumentationFile>$(OutDir)\Microsoft.PowerPlatform.Dataverse.Client.xml</DocumentationFile>
14-
<AnalysisLevel>6.0</AnalysisLevel>
15-
</PropertyGroup>
11+
<PropertyGroup>
12+
<GeneratePackageOnBuild>false</GeneratePackageOnBuild>
13+
<DocumentationFile>$(OutDir)\Microsoft.PowerPlatform.Dataverse.Client.xml</DocumentationFile>
14+
<AnalysisLevel>6.0</AnalysisLevel>
15+
</PropertyGroup>
1616

1717

18-
<ItemGroup>
19-
<Compile Remove="UnitTestBehaviors\**" />
20-
<Compile Remove="UnitTests\**" />
21-
<EmbeddedResource Remove="UnitTestBehaviors\**" />
22-
<EmbeddedResource Remove="UnitTests\**" />
23-
<None Remove="UnitTestBehaviors\**" />
24-
<None Remove="UnitTests\**" />
25-
</ItemGroup>
18+
<ItemGroup>
19+
<Compile Remove="UnitTestBehaviors\**" />
20+
<Compile Remove="UnitTests\**" />
21+
<EmbeddedResource Remove="UnitTestBehaviors\**" />
22+
<EmbeddedResource Remove="UnitTests\**" />
23+
<None Remove="UnitTestBehaviors\**" />
24+
<None Remove="UnitTests\**" />
25+
</ItemGroup>
2626

27-
<ItemGroup>
28-
<PackageReference Include="Microsoft.Xrm.Sdk" Version="$(PackageVersion_CdsSdk)" />
29-
<PackageReference Include="Microsoft.Crm.Sdk.Proxy" Version="$(PackageVersion_CrmProxy)" />
30-
<PackageReference Include="Microsoft.CSharp" Version="4.7.0" />
31-
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="$(PackageVersion_Microsoft_Extensions)" />
32-
<PackageReference Include="Microsoft.Extensions.Http" Version="$(PackageVersion_Microsoft_Extensions)" />
33-
<PackageReference Include="Microsoft.Extensions.Logging" Version="$(PackageVersion_Microsoft_Extensions)" />
34-
<PackageReference Include="Microsoft.Identity.Client" version="$(PackageVersion_MSAL)" />
35-
<PackageReference Include="Microsoft.Rest.ClientRuntime" Version="$(PackageVersion_RestClientRuntime)" />
36-
<PackageReference Include="Microsoft.VisualBasic" Version="10.3.0" />
37-
<PackageReference Include="Newtonsoft.Json" Version="$(PackageVersion_Newtonsoft)" />
38-
<PackageReference Include="System.Configuration.ConfigurationManager" Version="$(PackageVersion_SystemConfigurationConfigurationManager)" />
39-
<!--<PackageReference Include="System.Security.Cryptography.Algorithms" Version="4.3.1" />
27+
<ItemGroup>
28+
<PackageReference Include="Microsoft.Xrm.Sdk" Version="$(PackageVersion_CdsSdk)" />
29+
<PackageReference Include="Microsoft.Crm.Sdk.Proxy" Version="$(PackageVersion_CrmProxy)" />
30+
<PackageReference Include="Microsoft.CSharp" Version="4.7.0" />
31+
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="$(PackageVersion_Microsoft_Extensions)" />
32+
<PackageReference Include="Microsoft.Extensions.Http" Version="$(PackageVersion_Microsoft_Extensions)" />
33+
<PackageReference Include="Microsoft.Extensions.Logging" Version="$(PackageVersion_Microsoft_Extensions)" />
34+
<PackageReference Include="Microsoft.Identity.Client" version="$(PackageVersion_MSAL)" />
35+
<PackageReference Include="Microsoft.Rest.ClientRuntime" Version="$(PackageVersion_RestClientRuntime)" />
36+
<PackageReference Include="Microsoft.VisualBasic" Version="10.3.0" />
37+
<PackageReference Include="System.ServiceModel.Http" version="4.10.3" />
38+
<PackageReference Include="System.ServiceModel.Primitives" version="4.10.3" />
39+
<PackageReference Include="Newtonsoft.Json" Version="$(PackageVersion_Newtonsoft)" />
40+
<PackageReference Include="System.Configuration.ConfigurationManager" Version="$(PackageVersion_SystemConfigurationConfigurationManager)" />
41+
<!--<PackageReference Include="System.Security.Cryptography.Algorithms" Version="4.3.1" />
4042
<PackageReference Include="System.Security.Cryptography.ProtectedData" Version="4.7.0" />
4143
<PackageReference Include="System.Security.Permissions" Version="$(PackageVersion_SystemSecurityPermissions)" /> -->
42-
<PackageReference Include="System.Text.Json" Version="$(PackageVersion_SystemTextJson)" />
43-
<PackageReference Include="Microsoft.Identity.Client.Extensions.Msal" Version="$(PackageVersion_MSAL)" />
44-
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="$(PackageVersion_Microsoft_Extensions)" />
45-
<!--<PackageReference Include="System.Drawing.Common" Version="5.0.3" />--> <!-- explict add to deal with CVE-2021-24112 -->
46-
</ItemGroup>
44+
<PackageReference Include="System.Text.Json" Version="$(PackageVersion_SystemTextJson)" />
45+
<PackageReference Include="Microsoft.Identity.Client.Extensions.Msal" Version="$(PackageVersion_MSAL)" />
46+
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="$(PackageVersion_Microsoft_Extensions)" />
47+
<!--<PackageReference Include="System.Drawing.Common" Version="5.0.3" />-->
48+
<!-- explict add to deal with CVE-2021-24112 -->
49+
</ItemGroup>
4750

48-
<ItemGroup Condition="'$(TargetFramework)' == 'net462' or '$(TargetFramework)' == 'net472' or '$(TargetFramework)' == 'net48'">
49-
<Reference Include="System.Web" />
50-
</ItemGroup>
51+
<ItemGroup Condition="'$(TargetFramework)' == 'net462' or '$(TargetFramework)' == 'net472' or '$(TargetFramework)' == 'net48'">
52+
<Reference Include="System.Web" />
53+
</ItemGroup>
5154

5255
</Project>

src/GeneralTools/DataverseClient/Client/ServiceClient.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1871,7 +1871,7 @@ internal async Task<OrganizationResponse> Command_ExecuteAsyncImpl(OrganizationR
18711871
retry = ShouldRetry(req, ex, retryCount, out isThrottled);
18721872
if (retry)
18731873
{
1874-
Utilities.RetryRequest(req, requestTrackingId, LockWait, logDt, _logEntry, SessionTrackingId, _disableConnectionLocking, _retryPauseTimeRunning, ex, errorStringCheck, ref retryCount, isThrottled);
1874+
retryCount = await Utilities.RetryRequest(req, requestTrackingId, LockWait, logDt, _logEntry, SessionTrackingId, _disableConnectionLocking, _retryPauseTimeRunning, ex, errorStringCheck, retryCount, isThrottled).ConfigureAwait(false);
18751875
}
18761876
else
18771877
{
@@ -1978,7 +1978,10 @@ internal OrganizationResponse Command_Execute(OrganizationRequest req, string er
19781978
retry = ShouldRetry(req, ex, retryCount, out isThrottled);
19791979
if (retry)
19801980
{
1981-
Utilities.RetryRequest(req, requestTrackingId, LockWait, logDt, _logEntry, SessionTrackingId, _disableConnectionLocking, _retryPauseTimeRunning, ex, errorStringCheck, ref retryCount, isThrottled);
1981+
Task.Run(async () =>
1982+
{
1983+
retryCount = await Utilities.RetryRequest(req, requestTrackingId, LockWait, logDt, _logEntry, SessionTrackingId, _disableConnectionLocking, _retryPauseTimeRunning, ex, errorStringCheck, retryCount, isThrottled).ConfigureAwait(false);
1984+
}).ConfigureAwait(false).GetAwaiter().GetResult();
19821985
}
19831986
else
19841987
{

src/GeneralTools/DataverseClient/Client/Utils/Utils.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -446,14 +446,15 @@ internal static string ConstructWebApiRequestUrl(OrganizationRequest request, Ht
446446
/// <param name="retryCount">retryCount</param>
447447
/// <param name="isThrottled">when set indicated this was caused by a Throttle</param>
448448
/// <param name="webUriReq"></param>
449-
internal static void RetryRequest(OrganizationRequest req, Guid requestTrackingId, TimeSpan LockWait, Stopwatch logDt,
449+
internal static async Task<int> RetryRequest(OrganizationRequest req, Guid requestTrackingId, TimeSpan LockWait, Stopwatch logDt,
450450
DataverseTraceLogger logEntry, Guid? sessionTrackingId, bool disableConnectionLocking, TimeSpan retryPauseTimeRunning,
451-
Exception ex, string errorStringCheck, ref int retryCount, bool isThrottled, string webUriReq = "")
451+
Exception ex, string errorStringCheck, int retryCount, bool isThrottled, string webUriReq = "")
452452
{
453453
retryCount++;
454454
logEntry.LogFailure(req, requestTrackingId, sessionTrackingId, disableConnectionLocking, LockWait, logDt, ex, errorStringCheck, webUriMessageReq: webUriReq);
455455
logEntry.LogRetry(retryCount, req, retryPauseTimeRunning, isThrottled: isThrottled);
456-
Task.Delay(retryPauseTimeRunning);
456+
await Task.Delay(retryPauseTimeRunning).ConfigureAwait(false);
457+
return retryCount;
457458
}
458459

459460
/// <summary>

src/GeneralTools/DataverseClient/UnitTests/CdsClient_Core_Tests/ServiceClientTests.cs

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
using Microsoft.Xrm.Sdk.Metadata;
1616
using Microsoft.Xrm.Sdk.Query;
1717
using Moq;
18+
using Newtonsoft.Json.Bson;
1819
using System;
1920
using System.Collections.Generic;
2021
using System.Diagnostics;
@@ -752,6 +753,57 @@ public void TestResponseHeaderBehavior()
752753
Assert.Equal(defaultDOP, cli.RecommendedDegreesOfParallelism);
753754
}
754755

756+
[Fact]
757+
public void RetryOperationTest()
758+
{
759+
Mock<IOrganizationService> orgSvc = null;
760+
Mock<MoqHttpMessagehander> fakHttpMethodHander = null;
761+
ServiceClient cli = null;
762+
testSupport.SetupMockAndSupport(out orgSvc, out fakHttpMethodHander, out cli);
763+
764+
Guid testGuid = Guid.NewGuid();
765+
766+
CreateRequest exampleRequest = new CreateRequest();
767+
exampleRequest.Target = new Entity("account");
768+
exampleRequest.Target.Attributes.Add("id", testGuid);
769+
770+
Stopwatch testwatch = Stopwatch.StartNew();
771+
int retrycount = 0;
772+
773+
Task.Run(async () =>
774+
{
775+
retrycount = await Utilities.RetryRequest(exampleRequest, testGuid, new TimeSpan(0), testwatch, cli._logEntry, null, false, new TimeSpan(0, 0, 1), new Exception("Fake_TEST_MSG"), "test retry logic", retrycount, false, null).ConfigureAwait(false);
776+
}).ConfigureAwait(false).GetAwaiter().GetResult();
777+
Assert.True(retrycount == 1);
778+
Task.Run(async () =>
779+
{
780+
retrycount = await Utilities.RetryRequest(exampleRequest, testGuid, new TimeSpan(0), testwatch, cli._logEntry, null, false, new TimeSpan(0, 0, 1), new Exception("Fake_TEST_MSG"), "test retry logic", retrycount, false, null).ConfigureAwait(false);
781+
}).ConfigureAwait(false).GetAwaiter().GetResult();
782+
Assert.True(retrycount == 2);
783+
}
784+
785+
[Fact]
786+
public async void RetryOperationAyncTest()
787+
{
788+
Mock<IOrganizationService> orgSvc = null;
789+
Mock<MoqHttpMessagehander> fakHttpMethodHander = null;
790+
ServiceClient cli = null;
791+
testSupport.SetupMockAndSupport(out orgSvc, out fakHttpMethodHander, out cli);
792+
793+
Guid testGuid = Guid.NewGuid();
794+
795+
CreateRequest exampleRequest = new CreateRequest();
796+
exampleRequest.Target = new Entity("account");
797+
exampleRequest.Target.Attributes.Add("id", testGuid);
798+
799+
Stopwatch testwatch = Stopwatch.StartNew();
800+
int retrycount = 0;
801+
802+
retrycount = await Utilities.RetryRequest(exampleRequest, testGuid, new TimeSpan(0), testwatch, cli._logEntry, null, false, new TimeSpan(0, 0, 1), new Exception("Fake_TEST_MSG"), "test retry logic", retrycount, false, null).ConfigureAwait(false);
803+
Assert.True(retrycount == 1);
804+
retrycount = await Utilities.RetryRequest(exampleRequest, testGuid, new TimeSpan(0), testwatch, cli._logEntry, null, false, new TimeSpan(0, 0, 1), new Exception("Fake_TEST_MSG"), "test retry logic", retrycount, false, null).ConfigureAwait(false);
805+
Assert.True(retrycount == 2);
806+
}
755807

756808
#region LiveConnectedTests
757809

src/nuspecs/Microsoft.PowerPlatform.Dataverse.Client.ReleaseNotes.txt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,13 @@ Notice:
77
Note: Only AD on FullFramework, OAuth, Certificate, ClientSecret Authentication types are supported at this time.
88

99
++CURRENTRELEASEID++
10+
Fix for Retry hang introduced in 1.1.21:
11+
Dependency Changes:
12+
Added:
13+
System.ServiceModel.Http 4.10.3
14+
System.ServiceModel.Primitives 4.10.3
15+
16+
1.1.21:
1017
Updated Core SDK to 9.2.24044.9795
1118
Added new ServiceClient method for creating requests called "RequestBuilder" - will allow you to create a request and customized header, user, and other properties as part of there request generation.
1219
Dependency Changes:

src/nuspecs/Microsoft.PowerPlatform.Dataverse.Client.nuspec

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,8 @@
5959
<dependency id="System.Runtime.Serialization.Primitives" version="4.3.0" exclude="Build,Analyzers" />
6060
<dependency id="System.Runtime.Serialization.Xml" version="4.3.0" exclude="Build,Analyzers" />
6161
<dependency id="System.Security.Permissions" version="[$PackageVersion_SystemSecurityPermissions$,)" exclude="Build,Analyzers" />
62-
<dependency id="System.ServiceModel.Http" version="4.10.2" exclude="Build,Analyzers" />
62+
<dependency id="System.ServiceModel.Http" version="4.10.3" exclude="Build,Analyzers" />
63+
<dependency id="System.ServiceModel.Primitives" version="4.10.3" exclude="Build,Analyzers" />
6364
<dependency id="System.Text.Json" version="[$PackageVersion_SystemTextJson$,)" exclude="Build,Analyzers" />
6465
<dependency id="Microsoft.Extensions.DependencyInjection" version="[$PackageVersion_Microsoft_Extensions$,)" exclude="Build,Analyzers" />
6566
<dependency id="Microsoft.Extensions.Http" version="[$PackageVersion_Microsoft_Extensions$,)" exclude="Build,Analyzers" />

0 commit comments

Comments
 (0)