【问题标题】:Consume form data by wcf service sending by post通过 wcf 服务使用邮寄方式发送的表单数据
【发布时间】:2011-08-29 09:01:10
【问题描述】:

我阅读了一些关于此的文章,我发现为了实现 wcf 从发布请求中获取数据,我们添加了

[ServiceContract]
public interface IService1 {
  [OperationContract]
  [WebInvoke(
      Method = "POST",
      BodyStyle = WebMessageBodyStyle.Bare,
      UriTemplate = "/GetData")]
  void GetData(Stream data);
}

并在实施中

public string GetData( Stream input)
{
    long incomingLength = WebOperationContext.Current.IncomingRequest.ContentLength;
    string[] result = new string[incomingLength];
    int cnter = 0;
    int arrayVal = -1;
    do
    {
        if (arrayVal != -1) result[cnter++] = Convert.ToChar(arrayVal).ToString();
        arrayVal = input.ReadByte();
    } while (arrayVal != -1);

    return incomingLength.ToString();
}

我的问题是,在表单请求中的提交操作将发送到我的服务并使用时,我应该怎么做?

在 Stream 参数中,我是否可以通过 Request["FirstName"] 获得表单中的发布信息?

【问题讨论】:

    标签: asp.net wcf forms post


    【解决方案1】:

    您的代码未正确解码请求正文 - 您正在创建一个 string 值数组,每个值都有一个字符。获取请求正文后,您需要解析查询字符串(使用HttpUtility 是一种简单的方法)。下面的代码显示了如何正确获取正文和其中一个字段。

    public class StackOverflow_7228102
    {
        [ServiceContract]
        public interface ITest
        {
            [OperationContract]
            [WebInvoke(
                Method = "POST",
                BodyStyle = WebMessageBodyStyle.Bare,
                UriTemplate = "/GetData")]
            string GetData(Stream data);
        }
        public class Service : ITest
        {
            public string GetData(Stream input)
            {
                string body = new StreamReader(input).ReadToEnd();
                NameValueCollection nvc = HttpUtility.ParseQueryString(body);
                return nvc["FirstName"];
            }
        }
        public static void Test()
        {
            string baseAddress = "http://" + Environment.MachineName + ":8000/Service";
            WebServiceHost host = new WebServiceHost(typeof(Service), new Uri(baseAddress));
            host.Open();
            Console.WriteLine("Host opened");
    
            WebClient c = new WebClient();
            c.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";
            Console.WriteLine(c.UploadString(baseAddress + "/GetData", "FirstName=John&LastName=Doe&Age=33"));
    
            Console.Write("Press ENTER to close the host");
            Console.ReadLine();
            host.Close();
        }
    }
    

    【讨论】:

    • 这是很好的解决方案 Tnx ;) 但是在测试方法中,您调用服务并向其发送发布请求。以
      localhost:8000/Service/GetData"> 之类的表单提交后调用服务方法是可能的(也是一种聪明的做法)?如果我这样做,它会起作用吗? :)
    • 是的,它应该可以工作(测试方法模拟 HTML 表单发布的内容)。问题是,当您默认提交表单时,您应该创建一个 HTML 页面将其发送回(而不是简单的字符串),否则浏览器只会向您显示字符串。另一种选择是在表单提交中使用一些 ajax 调用,然后您可以将结果返回为 XML(或 JSON)并内联更新页面。
    猜你喜欢
    • 1970-01-01
    • 2011-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多