假设我有一个包含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。
答案 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路由(或者有GetData
和PostData
这两种方法相同的路线,只有动词,RESTful方式不同)。还有一些警告 - 从我所看到的,你只能将字符串传递给GET请求,而不是整数。但总而言之,它运作良好。
如果我们使用WebAPI / REST启动项目,我们是否会选择使用映射到WebAPI端点的WCF代理?可能不是。但这使得我们可以通过相对较少的前端代码更改来切换后端。