Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 转换与WCF向后兼容的Web API_C#_Asp.net Mvc_Wcf_Asp.net Web Api - Fatal编程技术网

C# 转换与WCF向后兼容的Web API

C# 转换与WCF向后兼容的Web API,c#,asp.net-mvc,wcf,asp.net-web-api,C#,Asp.net Mvc,Wcf,Asp.net Web Api,假设我有一个WCF服务Service1.svc,它包含GetData(value) 我还有一个客户端,它已经自动生成代理来使用此服务,类似于: using (var client = new ServiceReference1.Service1Client()) { var result = client.GetData(1); //Assert.AreEqual("You entered: 1", result); } [RoutePrefix("Service1.svc")

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

我还有一个客户端,它已经自动生成代理来使用此服务,类似于:

using (var client = new ServiceReference1.Service1Client())
{
    var result = client.GetData(1);
    //Assert.AreEqual("You entered: 1", result);
}
[RoutePrefix("Service1.svc")]
public class DataController : ApiController
{
    [HttpGet]
    [Route("GetData")]
    public string GetDataOld(int value)
    {
        return string.Format("You entered: {0}", value);
    }
}
现在,我删除了该WCF服务,并将其替换为一个新的Web API服务,如下所示:

using (var client = new ServiceReference1.Service1Client())
{
    var result = client.GetData(1);
    //Assert.AreEqual("You entered: 1", result);
}
[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。

WebApi
被设计为
REST
端点,因此
var client=new ServiceReference1.Service1Client()
的wcf方式与此概念背道而驰


相反,您应该尝试通过url访问它,例如,它类似于
~\Service1.svc\GetData\1
。还要检查您的
路线
配置以确保

WebApi
被设计为
REST
端点,因此
var client=new serviceference1.Service1Client()
的wcf方式与此概念背道而驰


相反,您应该尝试通过url访问它,例如,它类似于
~\Service1.svc\GetData\1
。还要检查您的
路线
配置以确保

您的
servicerence1.Service1Client()
与WCF直接相关。不能将其重新用于与WebApi端点交互

如果您想要一个与WebApi端点交互的客户端,您需要自己编写一个包装器客户端。这是我的图书馆的首选。例如:

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"

(未测试)

您的
服务引用1.Service1Client()
与WCF直接相关。不能将其重新用于与WebApi端点交互

如果您想要一个与WebApi端点交互的客户端,您需要自己编写一个包装器客户端。这是我的图书馆的首选。例如:

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"

(未测试)

这是可能的,我们目前正在做类似的事情——我们用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,如果您愿意)

有更多的方法可以做到这一点,比如使用
UriTemplate
属性来指定更复杂的HTTP路由(或者有两种方法,
GetData
PostData
,它们都映射到相同的路由,并且只在动词(RESTful方式)上有所不同)。还有一些警告——从我看到的情况来看,您只能传递字符串来获取请求,而不能传递int。但总而言之,它运行得相当好


如果我们使用WebAPI/REST启动项目,我们会选择使用映射到WebAPI端点的WCF代理吗?可能不会。但这允许我们在前端代码更改相对较少的情况下切换后端。

这是可能的,我们目前正在做类似的事情——我们用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,如果您愿意)

有更多的方法可以做到这一点,比如使用
UriTemplate
属性来指定更复杂的HTTP路由(或者有两种方法,
GetData
PostData
,它们都映射到相同的路由,并且只在动词(RESTful方式)上有所不同)。还有一些警告——从我看到的情况来看,您只能传递字符串来获取请求,而不能传递int。但总而言之,它运行得相当好


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

这完全取决于使用的绑定。如果是WebHttpBinding,那么传输是REST;如果没有,您将不得不重新实现客户机或引入一个翻译代理,这并不简单。这完全取决于所使用的绑定。如果是WebHttpBinding,那么传输是REST;如果没有,您将不得不重新实现客户机或引入翻译代理,这并不是一件小事。