我繼承了舊版 .NET WCF 服務。它當前托管在 ASP.NET 應用程式中。
我需要將其提取到單獨的 ASP.NET Web API 2 服務中。我想完全擺脫 WCF 服務,而不是簡單地用 Web API 包裝它。
我知道如果我使用的是 .NET Core,它會簡單得多,因為我可以使用 Swagger。
不幸的是,這不是一個選項,因為我們使用的是標準的 .NET 框架。
我正在使用 Visual Studio 2019 并使用可用模板來創建服務框架。
我在創建正確的路由標簽時遇到了困難。我假設我的方法呼叫將映射到動作動詞。
這是一個示例代碼塊,反映了我的svc.cs檔案包含的內容:
using System;
using System.Linq;
using System.ServiceModel.Activation;
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class SampleService : ISampleService
{
public Result1 ServiceCallA(string param1, SampleClass1 param2, SampleClass2 param3) {}
public Result1 ServiceCallB(string param1, string param2, bool param3) {}
public Result2 ServiceCallC(string param1, string param2) {}
public Result2 ServiceCallD(string param1) {}
}
這是我的 Web API 定義的示例塊:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
public class ClientActivationController : ApiController
{
[HttpGet]
[Route("???")]
public Result1 ServiceCallA(string param1, SampleClass1 param2, SampleClass2 param3) {}
[HttpGet]
[Route("???")]
public Result1 ServiceCallB(string param1, string param2, bool param3) {}
[HttpGet]
[Route("???")]
public Result2 ServiceCallC(string param1, string param2) {}
[HttpGet]
[Route("???")]
public Result2 ServiceCallD(string param1) {}
}
這是標準樣板模板啟動代碼:
public class WebApiApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
GlobalConfiguration.Configure(WebApiConfig.Register);
}
}
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
我想使用HttpClient來訪問我的 Winforms 應用程式中的服務。
我不完全清楚如何使用嵌入引數構造 URL。
以下是使用該服務的代碼片段:
var uri = new Uri($"{ServiceUrl}/ServiceCallA ?????");
var response = await _client.GetAsync(uri);
if (response.IsSuccessStatusCode)
{
return Ok(response.Content.ReadAsStringAsync().Result);
}
else
{
return StatusCode(500, "Server error");
}
uj5u.com熱心網友回復:
這里的默認路由模板是
routeTemplate: "api/{controller}/{id}"
所以uri看起來像
var uri = new Uri($"{ServiceUrl}/api/ServiceCallD?id=n");
使用屬性路由,路由屬性應該反映正確的映射
[HttpGet]
[Route("api/sample/{param1}/{param2}")]
public Result2 ServiceCallC(string param1, string param2) {}
[HttpGet]
[Route("api/sample/{param1}")]
public Result2 ServiceCallD(string param1) {}
對于其他路線,您將創建一個新的路線映射
config.Routes.MapHttpRoute(
name: "AnotherApi",
routeTemplate: "api/{controller}/{param1}/{param2}"
);
uri 可能看起來像這樣;
var uri = new Uri($"{ServiceUrl}/api/ServiceCallC?param1=n¶m2=b");
這里有更多的例子;https://stackoverflow.com/a/25162019/1165173
https://www.tutorialteacher.com/webapi/parameter-binding-in-web-api
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/495280.html
標籤:C# 。网 wcf asp.net-web-api
