2

Я написал веб-сервис, который в браузере работает отлично. Я передать идентификатор клиента в этом вебе-сервисе, а затем возвращает строку, содержащее имя клиента, и который мы прошли, как это: http://prntscr.com/8c1g9zКак использовать Rest Web-сервис в C#

Моего код для создания службы является:

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 Как потреблять веб-службы. Может кто-нибудь, пожалуйста, помогите мне?

+2

'[WebGet]' 'означает, ш ebrequest.Method = "GET". – Eser

ответ

11

Исключение довольно ясное - вы не можете использовать POST, если хотите, чтобы извлекал данные из службы REST, если только это не разрешено. Вы должны использовать GET вместо POST, или просто не меняйте request.Method. По умолчанию это GET.

Вам не нужно ничего делать, чтобы «потреблять» службы REST - по сути, они работают так же, как и любой другой URL. HTTP POST глагол означает, что вы хотите создать новый ресурс или данные формы сообщения. Чтобы получить ресурс (страница, ответ API и т. Д.), Вы используете GET.

Это означает, что вы можете использовать любой из классов .NET, связанных с HTTP, для вызова службы REST - HttpClient (предпочтительно), WebClient или необработанного HttpWebRequest.

SOAP-сервисы использовали POST как для получения , так и отправки данных, которые теперь считаются ошибкой дизайна для всех (включая создателей SOAP).

EDIT

Чтобы пояснить это, используя GET означает, что нет контента и не связанных с содержанием заголовков или операции не требуется или разрешается. Это же, как и загрузка любого 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 непосредственно в браузере, чтобы получить такое же поведение

+1

Дополнительная информация: Невозможно отправить контент-тело с помощью этого глагола. в строке Stream stream = webrequest.GetRequestStream(); после GET –

+0

* Зачем * проходить тело? Вы определили действие с параметром Id, с идентификатором фактически как частью URL. Поместите идентификатор в запрос Url. Простой веб-запрос для http: // localhost: 8000/DEMOService/Client/156' достаточно. Даже «WebClient.GetString» по URL-адресу будет работать –

+0

спасибо за ответ. Но у меня есть то же самое в потребительском коде. см.: System.Net.HttpWebRequest webrequest = (HttpWebRequest) System.Net.WebRequest.Создание ("HTTP: // локальный: 8000/DEMOService/Client/156"); Но все еще не работает –

0

Этот апи является прекрасным примером того, как Потребляйте Rest Web Services в C#

// http://localhost: {portno}/API/v1/youractionname UserName = имя_пользователя & Passowrd = ВАШ ПАРОЛЬ [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; 
     } 
    } 
} 
+0

Хороший пример веб-сервисов Rest в C#. –

+0

Спасибо @Mannam Brahmam! –

Смежные вопросы