微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何读取HttpRequest的主体发布到REST Web服务 – C#WCF

我有一个呼叫REST Web服务的Apex类( SalesForce中的一个类).

public class WebServiceCallout 
{
    @future (callout=true)
    public static void sendNotification(String aStr) 
    {
        HttpRequest req = new HttpRequest();
        HttpResponse res = new HttpResponse();
        Http http = new Http();

        req.setEndpoint('http://xx.xxx.xxx.xx:41000/TestService/web/test');
        req.setMethod('POST');
        req.setHeader('Content-Type','application/json');
        req.setBody(aStr); // I want to read this in the web service

        try 
        {
            res = http.send(req);
        } 
        catch(System.CalloutException e) 
        {
            System.debug('Callout error: '+ e);
            System.debug(res.toString());
        }
    }
}

REST Web服务(C#,WCF)如下所示:

public interface ITestService
{
    [OperationContract]
    [WebInvoke(Method = "POST",ResponseFormat = Webmessageformat.Json,BodyStyle = WebMessageBodyStyle.Bare,UriTemplate = "/test")]
    string Test(string aStr);
}

test()方法执行基本操作.

我跑的时候

WebServiceCallout.sendNotification("a test message")

POST到达Web服务但是如何读取在sendNotification()方法中设置的HttpRequest req主体中设置的内容 – req.setBody(aStr);?

也就是说,字符串Test的参数应该是什么(字符串aStr);是?

我是否需要在WebInvoke或App.config(例如绑定)中指定其他任何配置/属性

解决方法

如果要读取传入请求的原始主体,则应将参数类型定义为Stream,而不是字符串.下面的代码显示了实现场景的一种方法,而 http://blogs.msdn.com/b/carlosfigueira/archive/2008/04/17/wcf-raw-programming-model-receiving-arbitrary-data.aspx的帖子提供了有关此“原始”模式的更多信息.

public class StackOverflow_25377059
{
    [ServiceContract]
    public interface ITestService
    {
        [OperationContract]
        [WebInvoke(Method = "POST",UriTemplate = "/test")]
        string Test(Stream body);
    }

    public class Service : ITestService
    {
        public string Test(Stream body)
        {
            return new StreamReader(body).ReadToEnd();
        }
    }

    class RawMapper : WebContentTypeMapper
    {
        public override WebContentFormat GetmessageformatForContentType(string contentType)
        {
            return WebContentFormat.Raw;
        }
    }

    public static void test()
    {
        var baseAddress = "http://" + Environment.MachineName + ":8000/Service";
        var host = new ServiceHost(typeof(Service),new Uri(baseAddress));
        var binding = new WebHttpBinding { ContentTypeMapper = new RawMapper() };
        host.AddServiceEndpoint(typeof(ITestService),binding,"").Behaviors.Add(new WebHttpBehavior());
        host.open();
        Console.WriteLine("Host opened");

        var req = (HttpWebRequest)HttpWebRequest.Create(baseAddress + "/test");
        req.Method = "POST";
        req.ContentType = "application/json";
        var reqStream = req.GetRequestStream();
        var body = "a test message";
        var bodyBytes = new UTF8Encoding(false).GetBytes(body);
        reqStream.Write(bodyBytes,bodyBytes.Length);
        reqStream.Close();
        var resp = (HttpWebResponse)req.GetResponse();
        Console.WriteLine("HTTP/{0} {1} {2}",resp.ProtocolVersion,(int)resp.StatusCode,resp.StatusDescription);
        foreach (var header in resp.Headers.AllKeys)
        {
            Console.WriteLine("{0}: {1}",header,resp.Headers[header]);
        }

        Console.WriteLine();
        Console.WriteLine(new StreamReader(resp.GetResponseStream()).ReadToEnd());
        Console.WriteLine();
    }
}

顺便说一下,你的传入请求在技术上是不正确的 – 你说(通过Content-Type)你发送的是JSON,但请求体(测试消息)不是有效的JSON字符串(它应该用引号括起来 – “测试消息”改为JSON字符串).

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐