【问题标题】:Consume WCF Restful service with datacontract使用 datacontract 使用 WCF Restful 服务
【发布时间】:2015-08-29 10:12:09
【问题描述】:

我创建了以下 restfull 网络服务:

界面

[ServiceContract]
public interface ISIGService
{
    [OperationContract]
    [WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Xml,
                   BodyStyle = WebMessageBodyStyle.Bare,
                   UriTemplate = "GetTicket/")]
    Ticket GetTicket(string user, string pwd);
}

实施

public class SIGService : ISIGService
{
    public Ticket GetTicket(string user, string pwd)
    {
        return new Ticket()
        {
            Usuario = "xx",
            UsuarioNombre = "xxx",
            UsuarioId = "xxx"
        };
    }

合同

[DataContract]
public class Ticket
{
    [DataMember]
    public int UsuarioId { get; set; }

    [DataMember]
    public string UsuarioNombre { get; set; }

    [DataMember]
    public string Usuario { get; set; }
}

我需要从 Web 应用程序使用此服务,并获取类型化对象 Ticket,为此我包含了一个服务引用。

服务器端代码

string urlService = 
    String.Format("http://localhost:22343/SIGService.svc/GetTicket/?user='{0}'&pwd='{1}'", 
                 usuario, password);

var request = (HttpWebRequest)WebRequest.Create(urlService);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();

Stream stream = response.GetResponseStream();
StreamReader reader = new StreamReader(stream);

string text = reader.ReadToEnd();

我放了一个text 变量只是为了得到一些东西,在这里有点迷失了。

我似乎没有得到这个对象,你能指点一下吗?

【问题讨论】:

  • 你的服务器端配置是什么样的??
  • @marc_s 给你,谢谢

标签: c# wcf rest datacontract


【解决方案1】:

很可能,您只需要更改您的网址

http://localhost:22343/SIGService.svc/GetTicket/?user='{0}'&pwd='{1}'

使用正确的 REST 语法(因为您使用的是 REST 服务):

http://localhost:22343/SIGService.svc/GetTicket/{user}/{pwd}

示例:

http://localhost:22343/SIGService.svc/GetTicket/daniel/topsecret

不需要?user= 或单引号......

这样,{0} 的值将传递给user 参数,{1} 的值将传递给pwd 参数。

为了使用该服务,我建议您查看出色的 RestSharp 库,它使您的 REST 服务的使用变得轻而易举。

您的代码将如下所示:

// set up the REST Client
string baseServiceUrl = "http://localhost:22343/SIGService.svc";

RestClient client = new RestClient(baseServiceUrl);

// define the request
RestRequest request = new RestRequest();
request.Method = Method.GET;
request.RequestFormat = DataFormat.Xml;
request.Resource = "GetTicket/{user}/{pwd}";
request.AddParameter("user", "daniel", ParameterType.UrlSegment);
request.AddParameter("pwd", "top$ecret", ParameterType.UrlSegment);

// make the call and have it deserialize the XML result into a Ticket object
var result = client.Execute<Ticket>(request);

if (result.StatusCode == HttpStatusCode.OK)
{
    Ticket ticket = result.Data;
}

【讨论】:

  • 很好的响应,但是如果没有这个 Rest 库,你有替代响应吗?谢谢
  • @DanielV:好吧,你可以像以前一样使用WebRequest——但是你会得到一个XML字符串,你必须自己处理将它反序列化为一个对象——工作量太大。 ...
  • 代码完美运行,确实序列化xml工作量太大。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-02
  • 2013-05-04
  • 1970-01-01
  • 2013-07-10
  • 1970-01-01
  • 2018-01-31
  • 1970-01-01
相关资源
最近更新 更多