【问题标题】:How to send data over POST without URI in WCF rest services如何在 WCF 休息服务中通过没有 URI 的 POST 发送数据
【发布时间】:2017-01-25 08:22:44
【问题描述】:

我是 WCF 的新手。我正在尝试实现一个用于身份验证的宁静服务。

我的 WCF 代码如下。

    [OperationContract]
    [WebInvoke(Method="POST", UriTemplate = "auth", RequestFormat=WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle=WebMessageBodyStyle.Wrapped)]
    Employee authEmployee(String username, String password);

我需要在这里做的是获取用户名和密码,而不是通过 URL 接收。 我如何做到这一点?

这对于专家来说可能是一个基本问题,但我对此并不陌生。任何帮助表示赞赏。

谢谢。

【问题讨论】:

  • 我很确定如果您使用 HttpWebRequest req =(HttpWebRequest)HttpWebRequest.Create(uri); 调用您的服务那么你需要uri,但是在设置方法时没有传递用户名和密码 req.Method = "POST";
  • 是不是意味着,消费者不需要在 URI 中传递值,我仍然会在用户名和密码变量中获取值??
  • 您的客户端应该通过创建请求和正确设置请求字段来调用服务方法,例如 HttpWebRequest req =(HttpWebRequest)HttpWebRequest.Create(uri); req.Methos = "发布"; req.ContentType = "应用程序/json"; byte[] bodyBytes = Encoding.UTF8.GetBytes("{\"Name\":\"John Doe\",\"Age\":33}"); req.GetRequestStream().Write(bodyBytes, 0, bodyBytes.Length); req.GetRequestStream().Close();这样,消费者必须传递值,但这些值不会直接通过 url
  • { "action": "Authenticate", "attributes": { "AccountName": "admin", "Password": "password" } }。这就是客户端发送数据的方式。那么我的服务方法中应该有 3 个参数吗?操作、帐户名和密码?
  • @PawełSwajdo 你应该发布答案而不是评论。

标签: c# .net rest wcf post


【解决方案1】:

为了清楚起见,我将在这里重写我的 cmets。

您的客户端应该通过创建请求和正确设置请求字段来调用服务方法,例如

HttpWebRequest req =(HttpWebRequest)HttpWebRequest.Create(uri);

req.Method = "Post"; 
req.ContentType = "application/json";
byte[] bodyBytes = Encoding.UTF8.GetBytes("{\"Name\":\"John Doe\",\"Age\":33}");

req.GetRequestStream().Write(bodyBytes, 0, bodyBytes.Length);  
req.GetRequestStream().Close();

当然还有

resp = (HttpWebResponse)req.GetResponse();

这样,消费者必须传递值,但值不会直接通过 url 传递

我认为方法名称是在 URI 中传递的,并且只有该方法需要的属性在 json 中传递。

【讨论】:

  • 谢谢。我会试试这个
【解决方案2】:

{ "action": "Authenticate", "attributes": { "AccountName": "admin", “密码”:“密码”}}。这就是客户端发送数据的方式。所以 我的服务方法中应该有 3 个参数吗?对于行动, 帐号名和密码?

在这种情况下,您的服务操作应如下所示:

Employee authEmployee(string action, attributes attr);

定义属性类型为:

class attributes
{
    string AccountName { get; set; }
    string Password { get; set; }
} 

附带说明,如果您以这种方式以明文形式传递凭据,则不是特别安全。

【讨论】:

    猜你喜欢
    • 2011-03-23
    • 2017-04-22
    • 1970-01-01
    • 2014-06-10
    • 2018-03-08
    • 2014-03-03
    • 1970-01-01
    • 2012-07-04
    • 1970-01-01
    相关资源
    最近更新 更多