Microsoft Fabric Community Conference 2025, March 31 - April 2, Las Vegas, Nevada. Use code MSCUST for a $150 discount.
Register nowThe Power BI DataViz World Championships are on! With four chances to enter, you could win a spot in the LIVE Grand Finale in Las Vegas. Show off your skills.
Hi,
following the instructions given in this post: http://community.powerbi.com/t5/Developer/How-do-I-update-the-Credentials-after-I-upload-a-report-to...
I ended up with the following snippet:
var gateway = (await m_powerBIClient.Gateways.GetGatewayByIdWithHttpMessagesAsync (datasource.GatewayId, cancellationToken: cancellationToken)).Body; var credentials = AsymmetricKeyEncryptionHelper.EncodeCredentials (username, password, gateway.PublicKey.Exponent, gateway.PublicKey.Modulus); var response = await m_powerBIClient.Gateways.UpdateDatasourceWithHttpMessagesAsync ( gateway.Id, datasource.Id, new UpdateDatasourceRequest ( new CredentialDetails ( credentials, credentialType: "Basic", encryptedConnection: "Encrypted", encryptionAlgorithm: "RSA-OAEP", privacyLevel: "Public" ) ), cancellationToken: cancellationToken);
But this leads to an internal server error. Do you know what is the missing part to get it running?
Solved! Go to Solution.
I have found out that the BadRequest was already in the GetGatewayByIdWithHttpMessagesAsync call. But nevertheless I found an easier way to handle the problem:
var request = new HttpRequestMessage ( new HttpMethod ("PATCH"), $"https://api.powerbi.com/v1.0/myorg/gateways/{gatewayDatasource.GatewayId}/datasources/{gatewayDatasource.Id}"); request.Content = new StringContent ( $@" {{ 'credentialType': 'Basic', 'basicCredentials': {{ 'username': '{username}', 'password': '{password}' }} }}"); request.Content.Headers.ContentType = MediaTypeHeaderValue.Parse ("application/json"); await m_powerBIClient.Credentials.ProcessHttpRequestAsync (request, cancellationToken);
No nasty encryption as it is a secure connection anyway. Wondering why basic credentials are not supported by the C# API.
@Anonymous wrote:
Hi,
following the instructions given in this post: http://community.powerbi.com/t5/Developer/How-do-I-update-the-Credentials-after-I-upload-a-report-to-POWER/td-p/223243
I ended up with the following snippet:
var gateway = (await m_powerBIClient.Gateways.GetGatewayByIdWithHttpMessagesAsync (datasource.GatewayId, cancellationToken: cancellationToken)).Body; var credentials = AsymmetricKeyEncryptionHelper.EncodeCredentials (username, password, gateway.PublicKey.Exponent, gateway.PublicKey.Modulus); var response = await m_powerBIClient.Gateways.UpdateDatasourceWithHttpMessagesAsync ( gateway.Id, datasource.Id, new UpdateDatasourceRequest ( new CredentialDetails ( credentials, credentialType: "Basic", encryptedConnection: "Encrypted", encryptionAlgorithm: "RSA-OAEP", privacyLevel: "Public" ) ), cancellationToken: cancellationToken);But this leads to an internal server error. Do you know what is the missing part to get it running?
@Anonymous
The code demo in this thread indeed works in my test when updating a datasource for a specific gateway. To have better troubleshooting, please add try..catch block to get the detailed error message for your code.
try{ //your code here } catch (HttpOperationException ex) { //Bad Request var content = ex.Response.Content; Console.WriteLine(content); }
By the way, have you debugged the code and which code line raised the error?
I have found out that the BadRequest was already in the GetGatewayByIdWithHttpMessagesAsync call. But nevertheless I found an easier way to handle the problem:
var request = new HttpRequestMessage ( new HttpMethod ("PATCH"), $"https://api.powerbi.com/v1.0/myorg/gateways/{gatewayDatasource.GatewayId}/datasources/{gatewayDatasource.Id}"); request.Content = new StringContent ( $@" {{ 'credentialType': 'Basic', 'basicCredentials': {{ 'username': '{username}', 'password': '{password}' }} }}"); request.Content.Headers.ContentType = MediaTypeHeaderValue.Parse ("application/json"); await m_powerBIClient.Credentials.ProcessHttpRequestAsync (request, cancellationToken);
No nasty encryption as it is a secure connection anyway. Wondering why basic credentials are not supported by the C# API.
There is currently some issue with V2 client.Gateways.UpdateDatasourceAsync
The body which is sent using that method:
{ "credentialDetails": { "credentials": "{\"credentialType\":\"Basic\",\"basicCredentials\":{\"username\":\"usrnmame\",\"password\":\"password\"}}" } }
where the correct one should be:
{ "credentialType":"Basic", "basicCredentials":{"username":"usrname","password":"password"} }
Simple http request as pointed above will work just fine:)
User | Count |
---|---|
10 | |
4 | |
4 | |
3 | |
3 |