转换Web API向后兼容WCF

时间:2016-05-12 15:06:05

标签: c# asp.net-mvc wcf asp.net-web-api

假设我有一个包含Service1.svc的WCF服务GetData(value)

[ServiceContract]
public interface IService1
{
    [OperationContract]
    string GetData(int value);
}

public class Service1 : IService1
{
    public string GetData(int value)
    {
        return string.Format("You entered: {0}", value);
    }
}

我还有一个客户端已经自动生成代理以使用此服务,如下所示:

using (var client = new ServiceReference1.Service1Client())
{
    var result = client.GetData(1);
    //Assert.AreEqual("You entered: 1", result);
}

现在,我删除了该WCF服务并将其替换为新的Web API服务,如下所示:

[RoutePrefix("Service1.svc")]
public class DataController : ApiController
{
    [HttpGet]
    [Route("GetData")]
    public string GetDataOld(int value)
    {
        return string.Format("You entered: {0}", value);
    }
}

因此,当我尝试使用客户端Service1Client()时,它不再起作用了。我很确定这是可能的,但我必须做些什么来实现这个目标?

2016年5月23日更新

由于这是不可能的,我决定创建一个代理,以便客户端可以轻松实现新的Restful Web API。

3 个答案:

答案 0 :(得分:0)

WebApi旨在成为REST个端点,因此var client = new ServiceReference1.Service1Client()的wcf方式与此概念相反。

相反,您应该尝试通过网址访问它,对于您的示例,它将类似于~\Service1.svc\GetData\1。另请检查route配置以确定。

答案 1 :(得分:0)

您的ServiceReference1.Service1Client()与WCF直接相关。您无法重复使用它与WebApi端点进行交互。

如果您希望客户端与WebApi端点交互,则需要自己编写包装器客户端。 RestSharp是我选择这样一个东西的库。例如:

var client = new RestClient("http://localhost:8000");
int value = 12345;

var request = new RestRequest($"Service1.svc/GetData/{value}", Method.GET);
IRestResponse response = client.Execute(request);
var content = response.Content; // returns "You entered: 12345"

(未测试的)

答案 2 :(得分:0)

这是可能的,我们目前正在做类似的事情 - 我们用WebAPI / JSON端点替换了我们的WCF / SOAP服务端点,而没有更改客户端的代理。

为此,您必须使用WebHttpBinding并向服务接口添加更多属性,以便代理生成正确的调用:

[ServiceContract]
public interface IService1
{
    [OperationContract]
    [WebGet]
    string GetData(int value);

    [OperationContract]
    [WebInvoke(Method="POST", RequestFormat = WebMessageFormat.Json)]
    void PostData(MyDataType data);
}

这将使代理使用HTTP调用而不是SOAP调用来访问您的服务。如您所见,这适用于GET和POST请求,并自动将数据序列化为JSON(或XML,如果您愿意)。

customize有更多方法 - 比如使用UriTemplate属性指定更复杂的HTTP路由(或者有GetDataPostData这两种方法相同的路线,只有动词,RESTful方式不同)。还有一些警告 - 从我所看到的,你只能将字符串传递给GET请求,而不是整数。但总而言之,它运作良好。

如果我们使用WebAPI / REST启动项目,我们是否会选择使用映射到WebAPI端点的WCF代理?可能不是。但这使得我们可以通过相对较少的前端代码更改来切换后端。