如何在 C# 中使用 WCF REST 服务?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/17565072/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-10 09:51:06  来源:igfitidea点击:

How to consume WCF REST Service in C#?

c#wcfrestwcf-rest

提问by senthil kumar

My contract details are below. I am using Json response and request format and also using POST method. How to write a client to consume this service in c#.

我的合同详情如下。我正在使用 Json 响应和请求格式,也使用 POST 方法。如何在 C# 中编写客户端来使用此服务。

[OperationContract()]
[WebInvoke(UriTemplate = "/RESTJson_Sample1_Sample1Add", Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest)]
int RESTJson_Sample1_Sample1Add(Int32 a, Int32 b, Int32 c);

回答by ranieuwe

If you want to consume a REST service from C# you can take a look at RestSharp. Note that with WCF you can also expose the same method using a basicHttp binding on a different endpoint and consume it using SOAP.

如果您想从 C# 使用 REST 服务,您可以查看RestSharp。请注意,使用 WCF,您还可以使用不同端点上的 basicHttp 绑定公开相同的方法,并使用 SOAP 使用它。

You can also take a look at WebChannelFactory, look at this MSDN tutorialtowards the end of the article.

您还可以查看 WebChannelFactory,查看本文末尾的MSDN 教程

回答by Amit

try as below:

尝试如下:

   [OperationContract()]
   [WebInvoke(UriTemplate = "/RESTJson_Sample1_Sample1Add?A=a&B=b&C=c", Method = "POST",  
     RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json,   
     BodyStyle = WebMessageBodyStyle.WrappedRequest)]
    int RESTJson_Sample1_Sample1Add(Int32 a, Int32 b, Int32 c);

       var httpWebRequest = (HttpWebRequest)WebRequest.Create("/RESTJson_Sample1_Sample1Add?A=a&B=b&C=c");
        httpWebRequest.ContentType = "text/json";
        httpWebRequest.Method = methodType;//POST/GET
        string responseText = "";
        using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
        {
            streamWriter.Write(body);//any parameter
        }
        var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
        using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
        {
            responseText = streamReader.ReadToEnd();
        }
        return responseText;

回答by Prateek Gupta

Here I have working code for POST method in WCF REST:-

这里我有 WCF REST 中 POST 方法的工作代码:-

First create database table with id,uname and pwd fields. create a stored procedure to insert values.

首先创建带有 id、uname 和 pwd 字段的数据库表。创建一个存储过程来插入值。

create  procedure [dbo].[sproc_Insertusers]
(
@id int out,
@uname nvarchar(50),
@pwd nvarchar(50)
)
as insert into tbl_register
(
[uname],
[pwd]
)
values
(
@uname,
@pwd
)

set @id = @@identity
return @id

Create new WCF project

创建新的 WCF 项目

in IService1.cs

在 IService1.cs

[ServiceContract]
    public interface IService1
    {
        [OperationContract]
        [WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "user_register/{uname}/{pwd}")]
        int user_register(string uname,string pwd);
    }

in Service1.cs

在 Service1.cs

 public class Service1 : IService1
    {
        SqlConnection cn = new SqlConnection(ConfigurationManager.AppSettings["iwealth_db"]);
        SqlCommand cmd;
        DataSet ds;
        SqlDataAdapter da;
        int result;
        public int user_register(string uname, string pwd)
        {
            cmd = new SqlCommand("sproc_Insertusers", cn);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.AddWithValue("@uname",uname);
            cmd.Parameters.AddWithValue("@pwd", pwd);
            cmd.Parameters.Add("@id", SqlDbType.Int);
            cmd.Parameters["@id"].Direction = ParameterDirection.Output;//Output parameter 

            cn.Open();
            cmd.ExecuteNonQuery();
            cn.Close();

            result = (int)(cmd.Parameters["@id"].Value);
            return result;//returning id 
        }
    }

in web.config:-

在 web.config 中:-

<?xml version="1.0"?>
<configuration>
  <appSettings>
    <add key="iwealth_db"  value="Data Source=localhost;Initial Catalog=iwealth; Trusted_Connection=true"/>      
  </appSettings>

  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>
  <system.serviceModel>
    <services>
      <service name="iWealthService.Service1" behaviorConfiguration="ServiceBehaviour">
        <!-- Service Endpoints -->
        <!-- Unless fully qualified, address is relative to base address supplied above -->
        <endpoint address ="" binding="webHttpBinding" contract="iWealthService.IService1" behaviorConfiguration="web">
          <!-- 
              Upon deployment, the following identity element should be removed or replaced to reflect the 
              identity under which the deployed service runs.  If removed, WCF will infer an appropriate identity 
              automatically.
          -->
        </endpoint>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="ServiceBehaviour">
          <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
          <serviceMetadata httpGetEnabled="true"/>
          <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="web">
          <webHttp/>
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
 <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>

</configuration>

Build the WCF. Now, the below code is how to use or consume this WCF service

构建 WCF。现在,下面的代码是如何使用或消费这个 WCF 服务

Create new website

创建新网站

Add register button to test this WCF service

添加注册按钮以测试此 WCF 服务

and on button click code:-

和按钮点击代码:-

 protected void Button1_Click(object sender, EventArgs e)
    {
//in 'sURL' paste WCF service link up to .svc and write -> /user_register/Prateek/1234 
//here user_register is service method path and Prateek and 1234 are parameters that will enter to database 


        string sURL = "http://localhost:49271/Service1.svc/user_register/Prateek/1234";

        WebRequest wrGETURL;
        wrGETURL = WebRequest.Create(sURL);
        wrGETURL.Method = "POST";
        wrGETURL.ContentType = @"application/json; charset=utf-8";
        HttpWebResponse webresponse = wrGETURL.GetResponse() as HttpWebResponse;

        Encoding enc = System.Text.Encoding.GetEncoding("utf-8");
        // read response stream from response object
        StreamReader loResponseStream = new StreamReader(webresponse.GetResponseStream(), enc);
        // read string from stream data
        strResult = loResponseStream.ReadToEnd();
        // close the stream object
        loResponseStream.Close();
        // close the response object
        webresponse.Close();
        // assign the final result to text box
        Response.Write(strResult);
    }

回答by K Raghava Reddy

To consume WCF Restful service, there is no need of making changes in Web.config. find the below code to consume the POST method of WCF restful service.

要使用 WCF Restful 服务,无需在 Web.config 中进行更改。找到下面的代码来消费WCF restful服务的POST方法。

        DataContractJsonSerializer objseria = new DataContractJsonSerializer(typeof(StudentDetails));
        MemoryStream mem = new MemoryStream();
        objseria.WriteObject(mem, stu);
        string data = Encoding.UTF8.GetString(mem.ToArray(), 0, (int)mem.Length);
        WebClient webClient = new WebClient();
        webClient.Headers["Content-type"] = "application/json";
        webClient.Encoding = Encoding.UTF8;
        webClient.UploadString("http://localhost:62013/Service1.svc/ADDStudent", "POST", data);

Reference link

参考链接