C# .NET Core调用Dify工作流:自动化开发新范式
1. C# .NET Core特性
- 跨平台能力:基于.NET Core 3.0的跨平台特性,使应用可部署于Windows、Linux及macOS
- 异步编程模型:通过async/await实现非阻塞IO操作,提升系统吞吐量
- 模块化设计:支持依赖注入(DI)和中间件(Middleware)架构,便于功能扩展
- 云原生特性:ASP.NET Core的Kestrel服务器支持Docker容器化部署
2. Dify工作流引擎
- 可视化编排:提供图形化工作流编辑器,支持DSL(领域特定语言)配置
- 智能节点:包含LLM调用、HTTP请求、模板引擎等核心节点
- 可扩展性:支持自定义工具和API集成,满足企业级需求
- 私有部署:提供本地化部署方案,确保数据安全
3. C#程序原码如下
private async Task<string> GetDataTrendAnalysis(string storeName)
{
string strReturn = "";
// 替换为您的Dify API密钥
string apiKey = "app-1234567890987654321";
string apiUrl = "https://dify2.****.com/v1/workflows/run";
// 清除可能存在的旧头部
client.DefaultRequestHeaders.Clear();
// 只添加授权头
client.DefaultRequestHeaders.Add("Authorization", #34;Bearer {apiKey}");
// 注意:不再添加 Content-Type 到请求头
var requestBody = new
{
inputs = new
{
a = storeName
},
response_mode = "streaming", //streaming:追求实时性或处理长文本。blocking:需要结构化数据或短文本响应。
user = "abc-123"
};
string jsonRequestBody = JsonConvert.SerializeObject(requestBody);
// Content-Type 在这里设置,作为 HttpContent 的一部分
StringContent content = new StringContent(jsonRequestBody, Encoding.UTF8, "application/json");
try
{
HttpResponseMessage response = await client.PostAsync(apiUrl, content);
if (response.IsSuccessStatusCode)
{
string responseBody = await response.Content.ReadAsStringAsync();
//Console.WriteLine("API Response: " + responseBody);
strReturn = ExtractTextFromStream(responseBody);
}
else
{
//Console.WriteLine(#34;请求失败: {response.StatusCode}");
string errorContent = await response.Content.ReadAsStringAsync();
//Console.WriteLine(#34;错误详情: {errorContent}");
}
}
catch (Exception ex)
{
Console.WriteLine(#34;发生异常: {ex.Message}");
}
return strReturn;
}
public static string ExtractTextFromStream(string streamContent)
{
var lines = Regex.Split(streamContent, "\r\n|\n");
string strReturn = "";
foreach (var line in lines)
{
if (line.StartsWith("data:"))
{
string jsonStr = line.Substring(5).Trim();
if (string.IsNullOrEmpty(jsonStr)) continue;
var json = JsonDocument.Parse(jsonStr);
try
{
// 确保变量在try块内声明
var root = json.RootElement;
var eventValue = root.GetProperty("event").GetString() ?? string.Empty;
if (eventValue.ToString() != "workflow_finished")
continue;
string dataObject = root.GetProperty("data").ToString();
CompletionResponseData completionResponseData = JsonConvert.DeserializeObject<CompletionResponseData>(dataObject);
strReturn = completionResponseData.outputs.text.ToString();
break;
}
catch (System.Text.Json.JsonException ex)
{
// 忽略解析错误,记录日志
Console.WriteLine(#34;JSON解析失败: {ex.Message}");
}
}
}
return strReturn;
}
#Zui懂保险的IT架构师#-----求一键四连:关注、点赞、分享、收藏