Skapa en klient för konsolappsökning i C#
Varning
Den 30 oktober 2020 flyttade Bing-sökning API:er från Azure AI-tjänster till Bing-sökning Services. Den här dokumentationen tillhandahålls endast som referens. Uppdaterad dokumentation finns i dokumentationen för API:et för Bing-sökning. Anvisningar om hur du skapar nya Azure-resurser för Bing-sökning finns i Skapa en Bing-sökning resurs via Azure Marketplace.
Den här självstudien visar hur du skapar en enkel .NET Core-konsolapp som låter användare köra frågor mot API:et för webbsökning i Bing och visa rangordnade resultat.
Den här självstudien visar hur du:
- Skapa en enkel fråga till API:et för webbsökning i Bing
- Visa frågeresultat i rangordnad ordning
Förutsättningar
Om du vill följa med i självstudien behöver du:
- En Azure-prenumeration – Skapa en kostnadsfritt
- När du har din Azure-prenumeration skapar du för att skapa en Bing-sökning resurs i Azure Portal för att hämta din nyckel och slutpunkt. När den har distribuerats klickar du på Gå till resurs.
- Visual Studio IDE.
Skapa ett nytt konsolappprojekt
Skapa ett projekt i Visual Studio med Ctrl
+Shift
+N
.
I dialogrutan Nytt projekt klickar du på Visual C# > Windows Classic Desktop > Console App (.NET Framework).
Ge programmet namnet MyConsoleSearchApp och klicka sedan på OK.
Lägg till JSON.net NuGet-paketet i projektet
JSON.net kan du arbeta med JSON-svar som returneras av API:et. Lägg till dess NuGet-paket i projektet:
- I Solution Explorer högerklickar du på projektet och väljer Hantera NuGet-paket....
- På fliken Bläddra söker du efter
Newtonsoft.Json
. Välj den senaste versionen och klicka sedan på Installera. - Klicka på knappen OK i fönstret Granska ändringar .
- Stäng fliken Visual Studio med rubriken NuGet: MyConsoleSearchApp.
Lägg till en referens till System.Web
Den här självstudien System.Web
förlitar sig på sammansättningen. Lägg till en referens till den här sammansättningen i projektet:
- I Solution Explorer högerklickar du på Referenser och väljer Lägg till referens...
- Välj Sammansättningsramverk>, rulla sedan nedåt och kontrollera System.Web
- Välj OK
Lägg till några nödvändiga användningsinstruktioner
Koden i den här självstudien kräver ytterligare tre användningsinstruktioner. Lägg till dessa instruktioner under de befintliga using
instruktionerna överst i Program.cs:
using System.Web;
using System.Net.Http;
Be användaren om en fråga
Öppna Program.csi Solution Explorer.
Main()
Uppdatera metoden:
static void Main()
{
// Get the user's query
Console.Write("Enter Bing query: ");
string userQuery = Console.ReadLine();
Console.WriteLine();
// Run the query and display the results
RunQueryAndDisplayResults(userQuery);
// Prevent the console window from closing immediately
Console.WriteLine("\nHit ENTER to exit...");
Console.ReadLine();
}
Den här metoden:
- Frågar användaren om en fråga
- Anropar
RunQueryAndDisplayResults(userQuery)
för att köra frågan och visa resultatet - Väntar på användarindata för att förhindra att konsolfönstret stängs omedelbart.
Sök efter frågeresultat med api:et för webbsökning i Bing
Lägg sedan till en metod som frågar API:et och visar resultatet:
static void RunQueryAndDisplayResults(string userQuery)
{
try
{
// Create a query
var client = new HttpClient();
client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", "<YOUR_SUBSCRIPTION_KEY_GOES_HERE>");
var queryString = HttpUtility.ParseQueryString(string.Empty);
queryString["q"] = userQuery;
var query = "https://api.cognitive.microsoft.com/bing/v7.0/search?" + queryString;
// Run the query
HttpResponseMessage httpResponseMessage = client.GetAsync(query).Result;
// Deserialize the response content
var responseContentString = httpResponseMessage.Content.ReadAsStringAsync().Result;
Newtonsoft.Json.Linq.JObject responseObjects = Newtonsoft.Json.Linq.JObject.Parse(responseContentString);
// Handle success and error codes
if (httpResponseMessage.IsSuccessStatusCode)
{
DisplayAllRankedResults(responseObjects);
}
else
{
Console.WriteLine($"HTTP error status code: {httpResponseMessage.StatusCode.ToString()}");
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
Den här metoden:
- Skapar en
HttpClient
för att fråga API:et för webbsökning -
Ocp-Apim-Subscription-Key
Anger HTTP-huvudet, som Bing använder för att autentisera begäran - Kör begäran och använder JSON.net för att deserialisera resultatet
- Anropar
DisplayAllRankedResults(responseObjects)
för att visa alla resultat i rangordnad ordning
Se till att ange värdet Ocp-Apim-Subscription-Key
för till din prenumerationsnyckel.
Visa rangordnade resultat
Innan du visar hur du visar resultaten i rangordnad ordning bör du ta en titt på ett exempel på webbsökningssvar:
{
"_type" : "SearchResponse",
"webPages" : {
"webSearchUrl" : "https:\/\/www.bing.com\/cr?IG=70BE289346...",
"totalEstimatedMatches" : 982000,
"value" : [{
"id" : "https:\/\/api.cognitive.microsoft.com\/api\/v7\/#WebPages.0",
"name" : "Contoso Sailing Club - Seattle",
"url" : "https:\/\/www.bing.com\/cr?IG=70BE289346ED4594874FE...",
"displayUrl" : "https:\/\/contososailingsea...",
"snippet" : "Come sail with Contoso in Seattle...",
"dateLastCrawled" : "2017-04-07T02:25:00"
},
{
"id" : "https:\/\/api.cognitive.microsoft.com\/api\/7\/#WebPages.6",
"name" : "Contoso Sailing Lessons - Official Site",
"url" : "http:\/\/www.bing.com\/cr?IG=70BE289346ED4594874FE...",
"displayUrl" : "https:\/\/www.constososailinglessonsseat...",
"snippet" : "Contoso sailing lessons in Seattle...",
"dateLastCrawled" : "2017-04-09T14:30:00"
},
...
],
"someResultsRemoved" : true
},
"relatedSearches" : {
"id" : "https:\/\/api.cognitive.microsoft.com\/api\/7\/#RelatedSearches",
"value" : [{
"text" : "sailing lessons",
"displayText" : "sailing lessons",
"webSearchUrl" : "https:\/\/www.bing.com\/cr?IG=70BE289346E..."
}
...
]
},
"rankingResponse" : {
"mainline" : {
"items" : [{
"answerType" : "WebPages",
"resultIndex" : 0,
"value" : {
"id" : "https:\/\/api.cognitive.microsoft.com\/api\/v7\/#WebPages.0"
}
},
{
"answerType" : "WebPages",
"resultIndex" : 1,
"value" : {
"id" : "https:\/\/api.cognitive.microsoft.com\/api\/v7\/#WebPages.1"
}
}
...
]
},
"sidebar" : {
"items" : [{
"answerType" : "RelatedSearches",
"value" : {
"id" : "https:\/\/api.cognitive.microsoft.com\/api\/v7\/#RelatedSearches"
}
}]
}
}
}
rankingResponse
JSON-objektet (dokumentationen) beskriver lämplig visningsordning för sökresultat. Den innehåller en eller flera av följande prioriterade grupper:
-
pole
: Sökresultaten för att få den mest synliga behandlingen (till exempel visas ovanför huvudlinjen och sidofältet). -
mainline
: Sökresultatet som ska visas i huvudraden. -
sidebar
: Sökresultatet som ska visas i sidofältet. Om det inte finns något sidofält visar du resultatet under huvudlinjen.
JSON för rangordningssvar kan innehålla en eller flera av grupperna.
I Program.cs lägger du till följande metod för att visa resultat i korrekt rangordnad ordning:
static void DisplayAllRankedResults(Newtonsoft.Json.Linq.JObject responseObjects)
{
string[] rankingGroups = new string[] { "pole", "mainline", "sidebar" };
// Loop through the ranking groups in priority order
foreach (string rankingName in rankingGroups)
{
Newtonsoft.Json.Linq.JToken rankingResponseItems = responseObjects.SelectToken($"rankingResponse.{rankingName}.items");
if (rankingResponseItems != null)
{
foreach (Newtonsoft.Json.Linq.JObject rankingResponseItem in rankingResponseItems)
{
Newtonsoft.Json.Linq.JToken resultIndex;
rankingResponseItem.TryGetValue("resultIndex", out resultIndex);
var answerType = rankingResponseItem.Value<string>("answerType");
switch (answerType)
{
case "WebPages":
DisplaySpecificResults(resultIndex, responseObjects.SelectToken("webPages.value"), "WebPage", "name", "url", "displayUrl", "snippet");
break;
case "News":
DisplaySpecificResults(resultIndex, responseObjects.SelectToken("news.value"), "News", "name", "url", "description");
break;
case "Images":
DisplaySpecificResults(resultIndex, responseObjects.SelectToken("images.value"), "Image", "thumbnailUrl");
break;
case "Videos":
DisplaySpecificResults(resultIndex, responseObjects.SelectToken("videos.value"), "Video", "embedHtml");
break;
case "RelatedSearches":
DisplaySpecificResults(resultIndex, responseObjects.SelectToken("relatedSearches.value"), "RelatedSearch", "displayText", "webSearchUrl");
break;
}
}
}
}
}
Den här metoden:
- Loopar över de
rankingResponse
grupper som svaret innehåller - Visar objekten i varje grupp genom att anropa
DisplaySpecificResults(...)
Lägg till följande två metoder i Program.cs:
static void DisplaySpecificResults(Newtonsoft.Json.Linq.JToken resultIndex, Newtonsoft.Json.Linq.JToken items, string title, params string[] fields)
{
if (resultIndex == null)
{
foreach (Newtonsoft.Json.Linq.JToken item in items)
{
DisplayItem(item, title, fields);
}
}
else
{
DisplayItem(items.ElementAt((int)resultIndex), title, fields);
}
}
static void DisplayItem(Newtonsoft.Json.Linq.JToken item, string title, string[] fields)
{
Console.WriteLine($"{title}: ");
foreach( string field in fields )
{
Console.WriteLine($"- {field}: {item[field]}");
}
Console.WriteLine();
}
Dessa metoder fungerar tillsammans för att mata ut sökresultaten till konsolen.
Kör programmet
Kör appen. Resultatet bör se ut ungefär så här:
Enter Bing query: sailing lessons seattle
WebPage:
- name: Contoso Sailing Club - Seattle
- url: https://www.bing.com/cr?IG=70BE289346ED4594874FE...
- displayUrl: https://contososailingsea....
- snippet: Come sail with Contoso in Seattle...
WebPage:
- name: Contoso Sailing Lessons Seattle - Official Site
- url: http://www.bing.com/cr?IG=70BE289346ED4594874FE...
- displayUrl: https://www.constososailinglessonsseat...
- snippet: Contoso sailing lessons in Seattle...
...
Nästa steg
Läs mer om att använda rangordning för att visa resultat.