簡體   English   中英

如何將我的 WCF 服務遷移到 .Net Web API?

[英]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&param2=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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM