如何在 C# 中使用 Rest Web 服务

How to consume Rest Web service in c#

我编写了一个在浏览器启动时运行良好的网络服务。我在此 Web 服务中传递了一个客户端 ID,然后 returns 一个包含客户端名称的字符串,我们像这样传递它:http://prntscr.com/8c1g9z

我创建服务的代码是:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.ServiceModel.Activation;
using System.ServiceModel.Web;

namespace RESTService.Lib
{
    [ServiceContract(Name = "RESTDemoServices")]
    public interface IRESTDemoServices
    {
        [OperationContract]
        [WebGet(UriTemplate = "/Client/{id}", BodyStyle = WebMessageBodyStyle.Bare)]
        string GetClientNameById(string Id);
    }

    [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Single, IncludeExceptionDetailInFaults = true)]
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    public class RestDemoServices:IRESTDemoServices
    {
        public string GetClientNameById(string Id)
        {
            return ("Le nom de client est Jack et id est : " +Id);
        }
    }
}

但是我吃不下。我的代码是:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Net.Http;
using System.Net;
using System.IO;
namespace ConsumerClient
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {   
            System.Net.HttpWebRequest webrequest = (HttpWebRequest)System.Net.WebRequest.Create("http://localhost:8000/DEMOService/Client/156");
            webrequest.Method = "POST";
            webrequest.ContentType = "application/json";
            webrequest.ContentLength = 0;
            Stream stream = webrequest.GetRequestStream();
            stream.Close();
            string result;
            using (WebResponse response = webrequest.GetResponse()) //It gives exception at this line liek this http://prntscr.com/8c1gye
            {
                using (StreamReader reader = new StreamReader(response.GetResponseStream()))
                {
                    result = reader.ReadToEnd();
                    Label1.Text = Convert.ToString(result);
                }
            }
        }
    }
}

我遇到这样的异常 http://prntscr.com/8c1gye 如何使用 Web 服务。有人可以帮我吗?

例外情况很明显 - 如果您想从 REST 服务检索 数据,则不能使用 POST,除非它允许。您应该使用 GET 而不是 POST,或者干脆不要更改 request.Method。默认为 GET.

您不需要对 "consume" REST 服务做任何特别的事情 - 本质上它们的工作方式与任何其他 URL 一样。 HTTP POST 动词表示您要创建 新资源或post 表单数据。要检索资源(页面、API 响应等),您可以使用 GET。

这意味着您可以使用任何 HTTP-related .NET 类 来调用 REST 服务 - HttpClient(首选)、WebClient 或原始 HttpWebRequest。

SOAP 服务使用 POST 获取 发送数据,现在每个人(包括 SOAP 的创建者)都认为这是设计错误。

编辑

为了清楚起见,使用 GET 表示没有内容,也没有内容相关 headers 或需要或不允许操作。这与下载任何 HTML 页面相同:

var url="http://localhost:8000/DEMOService/Client/156";
var webrequest = (HttpWebRequest)System.Net.WebRequest.Create(url);

using (var response = webrequest.GetResponse()) 
using (var reader = new StreamReader(response.GetResponseStream()))
{
    var result = reader.ReadToEnd();
    Label1.Text = Convert.ToString(result);
}

您甚至可以将 URL 直接粘贴到浏览器以获得相同的行为

此代码示例是如何在 C# 中使用 REST Web 服务的简单示例:

// http://localhost:{portno}/api/v1/youractionname?UserName=yourusername&Passowrd=yourpassword [HttpGet]

[ActionName("Youractionname")]

public Object Login(string emailid, string Passowrd)
{
    if (emailid == null || Passowrd == null)
    {
        geterror gt1 = new geterror();
        gt1.status = "0";
        gt1.msg = "All field is required";
        return gt1;
    }
    else
    {
        string StrConn = ConfigurationManager.ConnectionStrings["cn1"].ConnectionString;
        string loginid = emailid;
        string Passwrd = Passowrd;
        DataTable dtnews = new DataTable();
        SqlConnection con = new SqlConnection(StrConn);
        con.Open();
        SqlCommand cmd = new SqlCommand("sp_loginapi_app", con);
        cmd.CommandType = CommandType.StoredProcedure;
        SqlParameter p1 = new SqlParameter("@emailid", loginid);
        SqlParameter p2 = new SqlParameter("@password", Passowrd);
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        cmd.Parameters.Add(p1);
        cmd.Parameters.Add(p2);
        da.Fill(dtnews);
        if (dtnews.Rows[0]["id"].ToString() == "-1")
        {
            geterror gt1 = new geterror();
            gt1.status = "0";
            gt1.msg = "Invalid Username or Password";
            con.Close();
            return gt1;
        }
        else
        {
            dtmystring.Clear();
            dtmystring.Columns.Add(new DataColumn("id", typeof(int)));
            dtmystring.Columns.Add(new DataColumn("Name", typeof(string)));
            dtmystring.Columns.Add(new DataColumn("Password", typeof(string)));
            dtmystring.Columns.Add(new DataColumn("MobileNo", typeof(string)));
            dtmystring.Columns.Add(new DataColumn("Emailid", typeof(string)));
            DataRow drnew = dtmystring.NewRow();
            drnew["id"] = dtnews.Rows[0]["id"].ToString();
            drnew["Name"] = dtnews.Rows[0]["Name"].ToString();
            drnew["Password"] = dtnews.Rows[0]["Password"].ToString();
            drnew["MobileNo"] = dtnews.Rows[0]["MobileNo"].ToString();
            drnew["Emailid"] = dtnews.Rows[0]["emailid"].ToString();
            dtmystring.Rows.Add(drnew);
            gt.status = "1";
            gt.msg = dtmystring;
            con.Close();
            return gt;
        }
    }
}