Megosztás a következőn keresztül:


Kód írása egyéni összekötőben

Az egyéni kód átalakítja a kérelmek és a válaszok adattartalmát a meglévő irányelvsablonok hatókörén is túl. A kód használata elsőbbséget élvez a kód nélküli definícióval szemben.

További információ: Egyéni összekötő létrehozása nulláról.

Parancsfájlosztály

A kódnak végre kell hajtania egy ExecuteAsync nevű metódust, amely futásidőben van meghívva. Az osztályban szükség szerint egyéb módszereket is létrehozhat, és az ExecuteAsync metódusból meghívhatja őket. Az osztálynévnek Parancsfájlnak kell lennie, és implementálnia kell a ScriptBase adatbázist.

public class Script : ScriptBase
{
    public override Task<HttpResponseMessage> ExecuteAsync()
    {
        // Your code here
    }
}

A támogató osztályok és az interfészek definíciója

A parancsfájl osztály a következő osztályokra és interfészekre hivatkozik. Helyi teszteléshez és fordításhoz használhatók.

public abstract class ScriptBase
{
    // Context object
    public IScriptContext Context { get; }

    // CancellationToken for the execution
    public CancellationToken CancellationToken { get; }

    // Helper: Creates a StringContent object from the serialized JSON
    public static StringContent CreateJsonContent(string serializedJson);

    // Abstract method for your code
    public abstract Task<HttpResponseMessage> ExecuteAsync();
}

public interface IScriptContext
{
    // Correlation Id
    string CorrelationId { get; }

    // Connector Operation Id
    string OperationId { get; }

    // Incoming request
    HttpRequestMessage Request { get; }

    // Logger instance
    ILogger Logger { get; }

    // Used to send an HTTP request
    // Use this method to send requests instead of HttpClient.SendAsync
    Task<HttpResponseMessage> SendAsync(
        HttpRequestMessage request,
        CancellationToken cancellationToken);
}

Minták

„Helló világ!” parancsfájlja

Ez a mintaszkript mindig a Hello World adja vissza válaszként az összes kérésre.

public override async Task<HttpResponseMessage> ExecuteAsync()
{
    // Create a new response
    var response = new HttpResponseMessage();

    // Set the content
    // Initialize a new JObject and call .ToString() to get the serialized JSON
    response.Content = CreateJsonContent(new JObject
    {
        ["greeting"] = "Hello World!",
    }.ToString());

    return response;
}

Regex-parancsfájl

Az alábbi példa felvesz szöveget egyeztetéshez, majd a regex kifejezés visszaadja a válaszban az egyezés eredményét.

public override async Task<HttpResponseMessage> ExecuteAsync()
{
    // Check if the operation ID matches what is specified in the OpenAPI definition of the connector
    if (this.Context.OperationId == "RegexIsMatch")
    {
        return await this.HandleRegexIsMatchOperation().ConfigureAwait(false);
    }

    // Handle an invalid operation ID
    HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.BadRequest);
    response.Content = CreateJsonContent($"Unknown operation ID '{this.Context.OperationId}'");
    return response;
}

private async Task<HttpResponseMessage> HandleRegexIsMatchOperation()
{
    HttpResponseMessage response;

    // We assume the body of the incoming request looks like this:
    // {
    //   "textToCheck": "<some text>",
    //   "regex": "<some regex pattern>"
    // }
    var contentAsString = await this.Context.Request.Content.ReadAsStringAsync().ConfigureAwait(false);

    // Parse as JSON object
    var contentAsJson = JObject.Parse(contentAsString);

    // Get the value of text to check
    var textToCheck = (string)contentAsJson["textToCheck"];

    // Create a regex based on the request content
    var regexInput = (string)contentAsJson["regex"];
    var rx = new Regex(regexInput);

    JObject output = new JObject
    {
        ["textToCheck"] = textToCheck,
        ["isMatch"] = rx.IsMatch(textToCheck),
    };

    response = new HttpResponseMessage(HttpStatusCode.OK);
    response.Content = CreateJsonContent(output.ToString());
    return response;
}

Továbbítási parancsfájl

Az alábbi példa továbbítja a bejövő kérelmet a háttérnek.

public override async Task<HttpResponseMessage> ExecuteAsync()
{
    // Check if the operation ID matches what is specified in the OpenAPI definition of the connector
    if (this.Context.OperationId == "ForwardAsPostRequest")
    {
        return await this.HandleForwardOperation().ConfigureAwait(false);
    }

    // Handle an invalid operation ID
    HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.BadRequest);
    response.Content = CreateJsonContent($"Unknown operation ID '{this.Context.OperationId}'");
    return response;
}

private async Task<HttpResponseMessage> HandleForwardOperation()
{
    // Example case: If your OpenAPI definition defines the operation as 'GET', but the backend API expects a 'POST',
    // use this script to change the HTTP method.
    this.Context.Request.Method = HttpMethod.Post;

    // Use the context to forward/send an HTTP request
    HttpResponseMessage response = await this.Context.SendAsync(this.Context.Request, this.CancellationToken).ConfigureAwait(continueOnCapturedContext: false);
    return response;
}

Parancsfájl továbbítása és átalakítása

Az alábbi példa továbbítja a bejövő kérelmet, és átalakítja a háttéralkalmazásból visszaadott választ.

public override async Task<HttpResponseMessage> ExecuteAsync()
{
    // Check if the operation ID matches what is specified in the OpenAPI definition of the connector
    if (this.Context.OperationId == "ForwardAndTransformRequest")
    {
        return await this.HandleForwardAndTransformOperation().ConfigureAwait(false);
    }

    // Handle an invalid operation ID
    HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.BadRequest);
    response.Content = CreateJsonContent($"Unknown operation ID '{this.Context.OperationId}'");
    return response;
}

private async Task<HttpResponseMessage> HandleForwardAndTransformOperation()
{
    // Use the context to forward/send an HTTP request
    HttpResponseMessage response = await this.Context.SendAsync(this.Context.Request, this.CancellationToken).ConfigureAwait(continueOnCapturedContext: false);

    // Do the transformation if the response was successful, otherwise return error responses as-is
    if (response.IsSuccessStatusCode)
    {
        var responseString = await response.Content.ReadAsStringAsync().ConfigureAwait(continueOnCapturedContext: false);
        
        // Example case: response string is some JSON object
        var result = JObject.Parse(responseString);
        
        // Wrap the original JSON object into a new JSON object with just one key ('wrapped')
        var newResult = new JObject
        {
            ["wrapped"] = result,
        };
        
        response.Content = CreateJsonContent(newResult.ToString());
    }

    return response;
}

Támogatott névterek

Nem minden C# névtér támogatott. Jelenleg a következő névterekből használhatók függvények.

using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.IO.Compression;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Net.Security;
using System.Security.Authentication;
using System.Security.Cryptography;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using System.Web;
using System.Xml;
using System.Xml.Linq;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

GitHub-minták

Az összekötőben DocuSign például az Összekötők Power Platform a GitHub.

Egyéni kód – GYIK

Ha többet szeretne megtudni az egyéni kódról, lépjen a 4. lépésre: (Nem kötelező) Egyéni kód támogatásának használata.

K.: Egyéni csatlakozónként több parancsfájl is használható?
V: Nem, egyéni csatlakozónként csak egy parancsfájl támogatott.

K: Belső kiszolgálóhiba jelenik meg az egyéni csatlakozó frissítésekor. Mi lehet a probléma?
V: Valószínűleg ez a probléma a kód fordításával kapcsolatos. A jövőben a fordítási hibák teljes listáját megjelenítjük a felhasználói élmény javítása érdekében. Megoldásként ajánlott a támogató osztályokat használni a fordítási hibák helyi teszteléséhez.

K: Felvehetek naplózást a kódba, és le tudom követni a hibakeresést?
V: Jelenleg nem, de a jövőben ez is elérhető lesz.

K.: Hogyan tesztelhetem a kódot addig is?
V: Tesztelje helyben, és csak a támogatott névtérben megadott névterek használatával állítson össze kódot. A helyi teszteléssel kapcsolatos információk a Kód írása egyéni csatlakozóban oldalon találhatóak.

K.: Vannak korlátozások?
V: Igen. A parancsfájlnak 5 másodpercen belül be kell fejeznie a végrehajtást, és a parancsfájl mérete nem lehet nagyobb 1 MB-nál.

K.: Létrehozhatom saját http-ügyfelem parancsfájlokkal?
A: Jelenleg igen, de ezt a jövőben letiltjuk. Ennek javasolt módja a this.Context.SendAsync metódus használata.

K: Használhatok egyéni kódot a helyszíni adatátjáróval?
V: Jelenleg nem.

Virtual Network támogatás

Ha az összekötőt egy Virtual Networkhöz Power Platform csatolt környezetben használják, korlátozások érvényesek:

  • Context.SendAsync nyilvános végpont használ, ezért nem férhet hozzá a Virtual Networkon elérhető privát végpontok adataihoz.

Általános ismert problémák és korlátozások

Előfordulhat, hogy az OperationId fejléc base64 kódolású formátumban lesz visszaadva bizonyos régiókban. Ha az OperationId értéke szükséges egy implementációhoz, akkor ezt base64 dekódolni kell az alábbihoz hasonló módon.

public override async Task<HttpResponseMessage> ExecuteAsync()
{
    string realOperationId = this.Context.OperationId;
    // Resolve potential issue with base64 encoding of the OperationId
    // Test and decode if it's base64 encoded
    try {
        byte[] data = Convert.FromBase64String(this.Context.OperationId);
        realOperationId = System.Text.Encoding.UTF8.GetString(data);
    }
    catch (FormatException ex) {}
    // Check if the operation ID matches what is specified in the OpenAPI definition of the connector
    if (realOperationId == "RegexIsMatch")
    // Refer to the original examples above for remaining details
}

Következő lépés

Előzmények nélküli egyéni összekötő létrehozása

Visszajelzés küldése

Nagyra értékeljük az összekötőplatform problémáival kapcsolatos visszajelzéseket és az új funkciókkal kapcsolatos ötleteket. Ha visszajelzést szeretne küldeni, lépjen a Problémák küldése vagy segítség kérése az összekötőkkel kapcsolatban részre, és válassza ki a visszajelzés típusát.