如何在 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;
}
}
}
我编写了一个在浏览器启动时运行良好的网络服务。我在此 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;
}
}
}