首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WebInvoke参数为空

WebInvoke参数为空
EN

Stack Overflow用户
提问于 2012-09-17 02:23:03
回答 1查看 2.3K关注 0票数 0

我有一项服务,业务合同如下所示。我有一个WebInvoke属性,方法被设置为POST。我确实有一个UriTemplate。实际的服务方法名是SaveUser。我正在尝试传递一个用户对象(一个带有属性注释为数据成员属性的数据契约)。

代码语言:javascript
复制
[OperationContract]
[WebInvoke(Method = "POST", UriTemplate = "SaveUser", BodyStyle = WebMessageBodyStyle.WrappedRequest, RequestFormat = WebMessageFormat.Json)]
User SaveUser(User user);

客户端看起来如下所示。为了简单起见,我排除了令牌和授权等:

代码语言:javascript
复制
using (WebClient webClient = new WebClient())
{
    try
    {
        Random r = new Random();
        var partitionKey = Guid.NewGuid().ToString();
        var rowKey = r.Next(999900, 999999).ToString();

        User u = new User()
        {
            UserId = partitionKey,
            FirstName = "First-" + DateTime.Now.Ticks.ToString(),
            LastName = "Last-" + DateTime.Now.Ticks.ToString(),
            LoginName = rowKey,
            Password = "password1",
            PayPalEmailAddress = "First" + DateTime.Now.Ticks.ToString() + "@verascend.com",
            PhoneNumber = "+1206" + r.Next(1234567, 9999999).ToString()
        };

        string url = serviceBaseUrl + "/SaveUser";

        webClient.Headers["Content-type"] = "application/json; charset=utf-8";
        // webClient.Headers[HttpRequestHeader.Authorization] = authToken;

        DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(User));

        using (var memStream = new MemoryStream())
        {
            ser.WriteObject(memStream, u);

            Debug.WriteLine("-------------> "+ByteArrayToString(memStream.ToArray()));

            webClient.UploadData(url, "POST", memStream.ToArray());

        }
    }
    catch (WebException ex)
    {
        if (ex.Status == WebExceptionStatus.ProtocolError)
        {
            string responseText = string.Empty;

            using (Stream responseStream = ((HttpWebResponse)ex.Response).GetResponseStream())
            {
                using (StreamReader streamReader = new StreamReader(responseStream))
                {
                    responseText = streamReader.ReadToEnd();
                }
            }

            throw new Exception(responseText);
        }
        else
        {
            throw new Exception(ex.Message.ToString());
        }
    }
}

问题:服务方法(实际服务)接收param (用户)为NULL。我做错了什么?我尝试在服务合同中添加已知类型,但没有成功。

EN

回答 1

Stack Overflow用户

发布于 2012-09-24 20:58:10

您的问题是,您将操作定义为具有包装请求。这意味着参数必须包装在JSON对象中,而不是以“普通”JSON对象的形式发送,并且成员名必须对应于参数名(在您的例子中是user)。下面的代码执行包装;您可以看到,现在服务器正确地接收了该参数。另一种选择是将BodyStyle属性更改为Bare,而不是WrappedRequest (在这种情况下,需要将普通对象发送到服务操作)。

代码语言:javascript
复制
public class StackOverflow_12452466
{
    [ServiceContract]
    public interface ITest
    {
        [OperationContract]
        [WebInvoke(Method = "POST", UriTemplate = "SaveUser", BodyStyle = WebMessageBodyStyle.WrappedRequest, RequestFormat = WebMessageFormat.Json)]
        User SaveUser(User user);
    }

    public class Service : ITest
    {
        public User SaveUser(User user)
        {
            Console.WriteLine("User: {0}", user);
            return user;
        }
    }

    public class User
    {
        public string UserId { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string LoginName { get; set; }
        public string Password { get; set; }
        public string PayPalEmailAddress { get; set; }
        public string PhoneNumber { get; set; }

        public override string ToString()
        {
            return string.Format("Id={0},First={1},Last={2},Login={3},Pwd={4},PayPal={5},Phone={6}",
                UserId, FirstName, LastName, LoginName, Password, PayPalEmailAddress, PhoneNumber);
        }
    }

    public static void Test()
    {
        string serviceBaseUrl = "http://" + Environment.MachineName + ":8000/Service";
        ServiceHost host = new ServiceHost(typeof(Service), new Uri(serviceBaseUrl));
        host.AddServiceEndpoint(typeof(ITest), new WebHttpBinding(), "").Behaviors.Add(new WebHttpBehavior());
        host.Open();

        Random r = new Random();
        User u = new User()
        {
            UserId = "partitionKey",
            FirstName = "First-" + DateTime.Now.Ticks.ToString(),
            LastName = "Last-" + DateTime.Now.Ticks.ToString(),
            LoginName = "rowKey",
            Password = "password1",
            PayPalEmailAddress = "First" + DateTime.Now.Ticks.ToString() + "@verascend.com",
            PhoneNumber = "+1206" + r.Next(1234567, 9999999).ToString()
        };

        string url = serviceBaseUrl + "/SaveUser";

        WebClient webClient = new WebClient();
        webClient.Headers["Content-type"] = "application/json; charset=utf-8";

        Func<byte[], string> ByteArrayToString = (b) => Encoding.UTF8.GetString(b);
        DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(User));

        try
        {
            using (var memStream = new MemoryStream())
            {
                byte[] wrappingStart = Encoding.UTF8.GetBytes("{\"user\":");
                memStream.Write(wrappingStart, 0, wrappingStart.Length);
                ser.WriteObject(memStream, u);
                byte[] wrappingEnd = Encoding.UTF8.GetBytes("}");
                memStream.Write(wrappingEnd, 0, wrappingEnd.Length);

                Debug.WriteLine("-------------> " + ByteArrayToString(memStream.ToArray()));

                webClient.UploadData(url, "POST", memStream.ToArray());
            }
        }
        catch (WebException ex)
        {
            if (ex.Status == WebExceptionStatus.ProtocolError)
            {
                string responseText = string.Empty;

                using (Stream responseStream = ((HttpWebResponse)ex.Response).GetResponseStream())
                {
                    using (StreamReader streamReader = new StreamReader(responseStream))
                    {
                        responseText = streamReader.ReadToEnd();
                    }
                }

                throw new Exception(responseText);
            }
            else
            {
                throw new Exception(ex.Message.ToString());
            }
        }
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12452466

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档