[英]How do I migrate my WCF service to a .Net Web API?
我繼承了舊版 .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");
}
這里的默認路由模板是
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.