从 WCF 服务调用 Web API 端点

Posted

技术标签:

【中文标题】从 WCF 服务调用 Web API 端点【英文标题】:Calling Web API endpoint from WCF service 【发布时间】:2015-11-16 20:21:00 【问题描述】:

我正在尝试从我的 WCF 服务调用 Web API 端点,这是代码;

private static async Task RunAsync(string message)
    
        var model = new MyModel   
        
            Message = message
        ;

        using (var client = new HttpClient())
        
            client.BaseAddress = new Uri("http://localhost/");
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

            var response = await client.PostAsJsonAsync("api/RecordMessage", model);
        
    

我得到的响应是“404”。我可以从控制台应用程序发布消息,但我无法让它在我的 WCF 服务中运行它。我尝试将 Expect100Continue 设置为 true,但似乎并非如此。

我的 WCF 托管在 IIS 中。有人遇到过同样的问题吗?

【问题讨论】:

您的 Web API 托管在哪里?您提到您的 WCF 服务托管在 IIS 中,但是您调用的端点呢? 它也托管在 IIS 中 在 80 端口上,和你的 WCF 应用程序一样吗?​​ 不,WCF 使用 https:443。但是 Web API 使用的是 80。 【参考方案1】:

您正在尝试 POST 到 /api/RecordMessage 端点。如果您使用的是默认路由配置:

routes.MapHttpRoute(
    name: "API Default",
    routeTemplate: "api/controller/id",
    defaults: new  id = RouteParameter.Optional 
);

这意味着您必须有一个名为 RecordMessageController 的控制器,其中包含一个名为 Post 的方法:

public class RecordMessageController: ApiController

    public HttpResponseMessage Post()
    
        ... That's the action that will be invoked when you call
        ... POST /api/RecordMessage
    

【讨论】:

我可以从控制台应用程序发布消息,但我无法让它在我的 WCF 服务中运行,因此控制器没有问题。 如果您在控制台应用程序中使用相同的客户端代码,那么它没有理由不能在 WCF 应用程序中工作。 WCF 的性质没有什么特别的地方会使您的请求因 404 而失败。 以下是我可能建议您进一步调试此问题的建议:您可以在控制台应用程序中启用跟踪并捕获正在发送的确切 HTTP 请求。然后在您的 WCF 应用程序中执行相同的操作并比较结果,看看它们有何不同。 它们似乎也一样,我在想如果我错过了 IIS 上的设置。 如果您发出 2 个相同的请求,无论它们来自控制台应用程序、WCF 应用程序、用 Python 编写的脚本、Fiddler 作曲家 -> 它们都可以工作或全部工作以 404 失败。因此,您似乎没有从 WCF 应用程序发出相同的请求。

以上是关于从 WCF 服务调用 Web API 端点的主要内容,如果未能解决你的问题,请参考以下文章

添加对 ASP.NET Web API 服务的服务引用

将 WCF 转换为 WEB API:在 WEB API 中使用包装器重用 WCF 服务是个好主意吗?

从 wcf 服务调用第三方 Web 服务

如何从 POSTMAN 调用 WCF 服务方法

每次调用端点时,自托管 WCF 服务全局对象似乎都是新创建的

无法从本地机器调用 WCF 服务