none
关于通过WCF服务提供一个Url 接口供其他公司Post 数据的问题 RRS feed

  • 问题

  • Hello   everyone

             最近公司项目有一个需求想通过WCF 服务的方式来实现.

             情况是这样的: 

             我需要提供一个Url 接口类似http://www.abc.com/mo.aspx  给合作方, 合作方通过程序往Url 上Post 数据.

             类似http://www.abc.com/mo.aspx?a=111&b=222&c=333   他POST请求的的Content-Type为application/x-www-form-urlencoded.

     
       我的实现方法是:

       [ServiceContract]
        public interface IService1
        {
            [OperationContract]
            [WebGet]
            string EchoWithGet(string s);

            [OperationContract]
            [WebInvoke]
            string EchoWithPost(string s);
        }

     public class Service1 : IService1
        {   

            public string EchoWithGet(string s)
            {

               //接收 s 数据写入数据库
            }

            public string EchoWithPost(string s)
            {
               //接收 s 数据写入数据库
            }
          
        }
      
            在服务器上启动WCF服务,用于接收请求

              ServiceHost host = new ServiceHost(typeof(Service1), new Uri("http://www.abc.com:8020"));           
              host.AddServiceEndpoint(typeof(IService1), new BasicHttpBinding(), "Soap");
              ServiceEndpoint endpoint = host.AddServiceEndpoint(typeof(IService1), new WebHttpBinding(), "Web");
              endpoint.Behaviors.Add(new WebHttpBehavior());

              host.Open();

    通过上面的服务,合作方可以通过  http://www.abc.com:8020/Web/EchoWithGet?s=合作方的数据  这样的方式给我Post数据,但是这个
    url 上只支持1个s 参数,如果修改上面 EchoWithPost(string s ,string b) 的话会报异常如下:

    Operation 'EchoWithPost' of contract 'IService1' specifies multiple request body parameters to be serialized without any wrapper elements. At most one body parameter can be serialized without wrapper elements. Either remove the extra body parameters or set the BodyStyle property on the WebGetAttribute/WebInvokeAttribute to Wrapped.

    请问下我需要如何修改才能满足http://www.abc.com:8020/Web/EchoWithGet?s=参数1&b=参数2&m=参数3 
            

    2010年3月31日 10:34

答案

  • 这个问题 我已经给你测试过了。使用这个代码可以搞定。

                //提供方法执行的上下文环境
                OperationContext context = OperationContext.Current;
                //获取传进的消息To属性
                MessageHeaders headers = context.IncomingMessageHeaders;
                //address
                string to = headers.To.ToString();


    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    欢迎访问老徐的中文技术博客:Welcome to My Chinese Technical Blog
    欢迎访问微软WCF中文技术论坛:Welcome to Microsoft Chinese WCF Forum
    欢迎访问微软WCF英文技术论坛:Welcome to Microsoft English WCF Forum
    2010年4月15日 4:32
    版主

全部回复

  • 你这个Rest的服务操作的定义有问题

      [OperationContract]
            [WebGet(UriTemplate = "/Rest?{a}&{b}")]
            public string EchoWithGet((string a,string b)
            {
                return a + b;

            }

    注意参数

    你想传递多个参数,客户端使用的URL地址就是

    http://www.abc.com/mo.aspx/rest?1&2

     


    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    欢迎访问老徐的中文技术博客:Welcome to My Chinese Technical Blog
    欢迎访问微软WCF中文技术论坛:Welcome to Microsoft Chinese WCF Forum
    欢迎访问微软WCF英文技术论坛:Welcome to Microsoft English WCF Forum
    2010年3月31日 13:34
    版主
  • Hi  Frank 

    你好,还有一个问题。。。

    如果现在通过一个WCF服务启动了2个Url    如: http://localhost:8020/web1/invoke.aspx          http://localhost:8020/web2/invoke.aspx

    供2个公司Post 数据, 服务契约如下 [ServiceContract]
        public interface IReceive
        {
            [OperationContract]   
            [WebInvoke(UriTemplate = "invoke.aspx")] 
            void DoWork(Stream input);
        }

     

     public class PassivelyReceive : IReceive
        {

            public  void DoWork(Stream input)
            {
                //throw new ApplicationException("test exception 2");
            }   

        }

     

    如何才能在DoWork 的具体实现里面  知道具体是从哪个Url 上Post 过来的数据?

    2010年4月15日 2:14
  • 这个问题 我已经给你测试过了。使用这个代码可以搞定。

                //提供方法执行的上下文环境
                OperationContext context = OperationContext.Current;
                //获取传进的消息To属性
                MessageHeaders headers = context.IncomingMessageHeaders;
                //address
                string to = headers.To.ToString();


    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    欢迎访问老徐的中文技术博客:Welcome to My Chinese Technical Blog
    欢迎访问微软WCF中文技术论坛:Welcome to Microsoft Chinese WCF Forum
    欢迎访问微软WCF英文技术论坛:Welcome to Microsoft English WCF Forum
    2010年4月15日 4:32
    版主
  • Thank you...

    2010年4月15日 5:10