C# 如何在客户端设置请求主体

C# 如何在客户端设置请求主体,c#,wcf,http,rest,C#,Wcf,Http,Rest,假设我使用C#和.NET使用以下web方法: [WebInvoke(UriTemplage="/users", Method="POST")] [OperationContract] public User AddNewUser(User u); 当您实现POST web方法时,您将接受请求正文作为传入HTTP请求消息的一部分。参数u应该从传入的HTTP消息体反序列化 我的问题是:我们如何在客户端设置这个请求主体?必须把它放在某个地方。这真让我困惑 除了在WebInvoke中添加“Respon

假设我使用C#和.NET使用以下web方法:

[WebInvoke(UriTemplage="/users", Method="POST")]
[OperationContract]
public User AddNewUser(User u);
当您实现POST web方法时,您将接受请求正文作为传入HTTP请求消息的一部分。参数u应该从传入的HTTP消息体反序列化

我的问题是:我们如何在客户端设置这个请求主体?必须把它放在某个地方。这真让我困惑

除了在WebInvoke中添加“ResponseFormat=WebMessageFormat.Json”之外,如何将返回的Json字符串反序列化到用户对象中?


谢谢

你的问题不能说明你做了什么。如果在客户端上使用.net,则可以使用获取序列化数据

然后,您可以使用,方法设置为POST。 将序列化数据添加到web请求并使用GetResponse()方法


或者,您可以使用创建的请求来测试web服务。它为您提供了一个关于服务器的精确视图。

要对您的WCF Rest方法执行POST请求,请执行以下操作:

    private string UseHttpWebApproach<T>(string serviceUrl, string resourceUrl, string method, T requestBody)
    {
            string responseMessage = null;                
            var request = WebRequest.Create(string.Concat(serviceUrl, resourceUrl)) as HttpWebRequest;
            if (request != null)
            {
                request.ContentType = "application/json";
                request.Method = method;
            }

            if(method == "POST" && requestBody != null)
            {                   
                byte[] requestBodyBytes = ToByteArrayUsingJsonContractSer(requestBody);                
                request.ContentLength = requestBodyBytes.Length;
                using (Stream postStream = request.GetRequestStream())
                    postStream.Write(requestBodyBytes, 0, requestBodyBytes.Length);
            }

            if (request != null)
            {
                var response = request.GetResponse() as HttpWebResponse;
                if(response.StatusCode == HttpStatusCode.OK)
                {
                    Stream responseStream = response.GetResponseStream();
                    if (responseStream != null)
                    {
                        var reader = new StreamReader(responseStream);

                        responseMessage = reader.ReadToEnd();
                    }
                }
                else
                {
                    responseMessage = response.StatusDescription;
                }
            }
            return responseMessage;
    }

    private static byte[] ToByteArrayUsingJsonContractSer<T> (T requestBody)
    {
        byte[] bytes = null;
        var serializer1 = new DataContractJsonSerializer(typeof(T));
        var ms1 = new MemoryStream();
        serializer1.WriteObject(ms1, requestBody);
        ms1.Position = 0;
        var reader = new StreamReader(ms1);
        bytes = ms1.ToArray();
        return bytes;
    }
要调用上述方法,请执行以下操作:

User objUser = new objUser();
objUser.Username = "Test";
objUser.Password = "Test";
UseHttpWebApproach<User>(serviceBaseUrl, "users", "POST", objUser);
User objUser=new objUser();
objUser.Username=“测试”;
objUser.Password=“测试”;
UseHttpWebApproach(serviceBaseUrl,“用户”,“帖子”,objUser);

您的响应消息是一个字符串。如何从中获取用户对象?谢谢您需要使用DataContractSerializer将字符串数据反序列化到对象实例中。如果请求正文包含一些敏感数据,如用户密码,如何确保安全性?您可以在服务器上使用Https和ssl。如果你真的想强化安全性,你也可以使用服务器发布的时间敏感哈希加密密码,可能是基于用户IP的,但这超出了这个问题的范围。如果这些答案对你有帮助,那么请花时间奖励答案。
User objUser = new objUser();
objUser.Username = "Test";
objUser.Password = "Test";
UseHttpWebApproach<User>(serviceBaseUrl, "users", "POST", objUser);