Offizieller .NET -API -Client für Stream Chat, einen Dienst zum Erstellen von Chat -Anwendungen.
Erforschen Sie die Dokumente »
Code -Beispiele · Fehler melden · Anforderungsfunktion
Sie können sich für ein Stream -Konto auf unserer Startseite anmelden.
Sie können diese Bibliothek verwenden, um auf die Server-Seite der Chat-API-Endpunkte zuzugreifen.
Für die clientseitigen Integrationen (Web und Mobile) sehen Sie sich die JavaScript-, iOS- und Android SDK-Bibliotheken (DOCS) an.
Veränderungen in v1.0 <
Die Bibliothek erhielt viele Änderungen in V1.0, um die Verwendung zu erleichtern und in Zukunft besser gewartet zu werden. Die Hauptänderung besteht darin, dass sowohl
Channelals auchClient-Klassen in kleine Module unterteilt wurden, die wir als Clients bezeichnen. (Dies resambiert auch die Struktur unserer Java -Bibliothek.) Hauptänderungen:
ChannelundClientsind verschwunden und wurden in kleineren Kunden inStreamChat.ClientsNamespace organisiert.- Diese Clients behalten den Zustand nicht als
Channelbei, der früher früher getan wurde, wo sie denchannelTypeundchannelIdim Speicher aufbewahrt haben. Dies bedeutet also, dass SiechannelTypeundchannelIdan viele Methodenaufrufe inIChannelClientübergeben müssen.- Async Methodnamen haben jetzt
AsyncSuffix.- Alle öffentlichen Methoden und Klassen haben Dokumentation.
- Die Identifikatoren wurden in
IDinIdumbenannt, um Microsofts Namenshandbuch zu befolgen. WieuserID->userId.- Viele Datenklassen wurden umbenannt, um sinnvoller zu sein. Wie
ChannelObject->Channel.- Datenklassen wurden in
StreamChat.Modelsnamespace verschoben.- Vollfunktion Parität: Alle Backend -APIs sind verfügbar.
- Die zurückgegebenen Werte sind Art der
ApiResponseund setzen die Ratenlimitinformaiton mitGetRateLimit()-Methode auf.- Die Ordnerstruktur des Projekts wurde neu organisiert, um die Empfehlung von Microsoft zu befolgen.
- Unit -Tests wurden verbessert. Sie sind kleiner, fokussierter und haben Reinigungsmethoden.
- Unterstützung .NET 6.0 Support.
Die ordnungsgemäße Verwendung der Bibliothek:
var clientFactory = new StreamClientFactory ( "YourApiKey" , "YourApiSecret" ) ; // Note: all client instances can be used as a singleton for the lifetime // of your application as they don't maintain state. var userClient = clientFactory . GetUserClient ( ) ; var channelClient = clientFactory . GetChannelClient ( ) ; var messageClient = clientFactory . GetMessageClient ( ) ; var reactionClient = clientFactory . GetReactionClient ( ) ; var jamesBond = await userClient . UpsertAsync ( new UserRequest { Id = "james_bond" } ) ; var agentM = await userClient . UpsertAsync ( new UserRequest { Id = "agent_m" } ) ; var channel = await channelClient . GetOrCreateAsync ( "messaging" , "superHeroChannel" , createdBy : jamesBond . Id ) ; await channelClient . AddMembersAsync ( channel . Type , channel . Id , jamesBond . Id , agentM . Id ) ; var message = await messageClient . SendMessageAsync ( channel . Type , channel . Id , jamesBond . Id , "I need a new quest Agent M." ) ; await reactionClient . SendReactionAsync ( message . Id , "like" , agentM . Id ) ;
$ dotnet add package stream-chat-netTIPP: Sie können Code -Beispiele im Samplesordner finden.
using StreamChat . Clients ; // Client factory instantiation.
var clientFactory = new StreamClientFactory ( "YourApiKey" , "YourApiSecret" ) ;
// Or you can configure some options such as custom HttpClient, HTTP timeouts etc.
var clientFactory = new StreamClientFactory ( "YourApiKey" , "YourApiSecret" , opts => opts . Timeout = TimeSpan . FromSeconds ( 5 ) ) ;
// Get clients from client factory. Note: all clients can be used as a singleton in your application.
var channelClient = clientFactory . GetChannelClient ( ) ;
var messageClient = clientFactory . GetMessageClient ( ) ; var userClient = clientFactory . GetUserClient ( ) ;
// Without expiration
var token = userClient . CreateToken ( "bob-1" ) ;
// With expiration
var token = userClient . CreateToken ( "bob-1" , expiration : DateTimeOffset . UtcNow . AddHours ( 1 ) ) ; var userClient = clientFactory . GetUserClient ( ) ;
var bob = new UserRequest
{
Id = "bob-1" ,
Role = Role . Admin ,
Teams = new [ ] { "red" , "blue" } // if multi-tenant enabled
} ;
bob . SetData ( "age" , 27 ) ;
await userClient . UpsertAsync ( bob ) ;
// Batch update is also supported
var jane = new UserRequest { Id = "jane" } ;
var june = new UserRequest { Id = "june" } ;
var users = await userClient . UpsertManyAsync ( new [ ] { bob , jane , june } ) ; var userClient = clientFactory . GetUserClient ( ) ;
await userClient . ExportAsync ( "bob-1" ) ;
await userClient . DeactivateAsync ( "bob-1" ) ;
await userClient . ReactivateAsync ( "bob-1" ) ;
await userClient . DeleteAsync ( "bob-1" ) ; var channelTypeClient = clientFactory . GetChannelTypeClient ( ) ;
var chanTypeConf = new ChannelTypeWithStringCommands
{
Name = "livechat" ,
Automod = Automod . Disabled ,
Commands = new List < string > { Commands . Ban } ,
Mutes = true
} ;
var chanType = await channelTypeClient . CreateChannelTypeAsync ( chanTypeConf ) ;
var allChanTypes = await channelTypeClient . ListChannelTypesAsync ( ) ; var channelClient = clientFactory . GetChannelClient ( ) ;
// Create a channel with members from the start, Bob is the creator
var channel = channelClient . GetOrCreateAsync ( "messaging" , "bob-and-jane" , bob . Id , bob . Id , jane . Id ) ;
// Create channel and then add members, Mike is the creator
var channel = channelClient . GetOrCreateAsync ( "messaging" , "bob-and-jane" , mike . Id ) ;
channelClient . AddMembersAsync ( channel . Type , channel . Id , bob . Id , jane . Id , joe . Id ) ; var messageClient = clientFactory . GetMessageClient ( ) ;
// Only text
messageClient . SendMessageAsync ( channel . Type , channel . Id , bob . Id , "Hey, I'm Bob!" ) ;
// With custom data
var msgReq = new MessageRequest { Text = "Hi june!" } ;
msgReq . SetData ( "location" , "amsterdam" ) ;
var bobMessageResp = await messageClient . SendMessageAsync ( channelType , channel . Id , msgReq , bob . Id ) ;
// Threads
var juneReply = new MessageRequest { Text = "Long time no see!" } ;
var juneReplyMessage = await messageClient . SendMessageToThreadAsync ( channel . Type , channel . Id , juneReply , june . Id , bobMessageResp . Message . Id ) var reactionClient = clientFactory . GetReactionClient ( ) ;
await reactionClient . SendReactionAsync ( message . Id , "like" , bob . Id ) ;
var allReactions = await reactionClient . GetReactionsAsync ( message . Id ) ; var channelClient = clientFactory . GetChannelClient ( ) ;
var userClient = clientFactory . GetUserClient ( ) ;
var flagClient = clientFactory . GetFlagClient ( ) ;
await channelClient . AddModeratorsAsync ( channel . Type , channel . Id , new [ ] { jane . Id } ) ;
await userClient . BanAsync ( new BanRequest
{
Type = channel . Type ,
Id = channel . Id ,
Reason = "reason" ,
TargetUserId = bob . Id ,
UserId = jane . Id
} ) ;
await flagClient . FlagUserAsync ( bob . Id , jane . Id ) ; var permissionClient = clientFactory . GetPermissionClient ( ) ;
await permissionClient . CreateRoleAsync ( "channel-boss" ) ;
// Assign users to roles (optional message)
await channelClient . AssignRolesAsync ( new AssignRoleRequest
{
AssignRoles = new List < RoleAssignment >
{
new RoleAssignment { UserId = bob . ID , ChannelRole = Role . ChannelModerator } ,
new RoleAssignment { UserId = june . ID , ChannelRole = "channel-boss" }
} ,
Message = new MessageRequest { Text = "Bob and June just became mods" , User = bob }
} ) ; var deviceClient = clientFactory . GetDeviceClient ( ) ;
var junePhone = new Device
{
ID = "iOS Device Token" ,
PushProvider = PushProvider . APN ,
UserId = june . ID
} ;
await deviceClient . AddDeviceAsync ( junePhone ) ;
var devices = await deviceClient . GetDevicesAsync ( june . Id ) ; var channelClient = clientFactory . GetChannelClient ( ) ;
var taskClient = clientFactory . GetTaskClient ( ) ;
var taskResponse = channelClient . ExportChannelAsync ( new ExportChannelRequest { Id = channel . Id , Type = channel . Type } ) ;
// Wait for the completion
var complete = false ;
var iterations = 0 ;
AsyncTaskStatusResponse resp = null ;
while ( ! complete && iterations < 1000 )
{
resp = await taskClient . GetTaskStatusAsync ( taskResponse . TaskId ) ;
if ( resp . Status == AsyncTaskStatus . Completed )
{
complete = true ;
break ;
}
iterations ++ ;
await Task . Delay ( 100 ) ;
}
if ( complete )
{
Console . WriteLine ( resp . Result [ "url" ] ) ;
} Wir begrüßen Code -Änderungen, die diese Bibliothek verbessern oder ein Problem beheben. Befolgen Sie bitte alle Best Practices und fügen Sie gegebenenfalls Tests hinzu, bevor Sie eine Pull -Anfrage auf GitHub senden. Wir freuen uns sehr, Ihren Code im offiziellen Repository zusammenzuführen. Stellen Sie zuerst unsere Mitwirkungslizenzvereinbarung (CLA) unterzeichnen. Weitere Informationen finden Sie in unserer Lizenzdatei.
Gehen Sie zu einigen Entwicklungs -Tipps.
Wir haben kürzlich eine Finanzierungsrunde der Serie B der Serie B in Höhe von 38 Millionen US -Dollar abgeschlossen und wachsen weiter aktiv. Unsere APIs werden von mehr als einer Milliarde Endbenutzern verwendet, und Sie haben die Möglichkeit, einen großen Einfluss auf das Produkt innerhalb eines Teams der stärksten Ingenieure auf der ganzen Welt zu haben.
Schauen Sie sich unsere aktuellen Öffnungen an und bewerben Sie sich über die Website von Stream.