gpt4 book ai didi

c# - 如何读取发布到 REST Web 服务的 HttpRequest 正文 - C# WCF

转载 作者:太空狗 更新时间:2023-10-30 00:51:44 25 4
gpt4 key购买 nike

我有一个调用 REST 网络服务的 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 网络服务(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 服务,但我如何才能读取在 HttpRequest reqbody 中设置的内容?在 sendNotification() 方法中 - req.setBody(aStr);?

string Test(string aStr);的参数应该是什么?

我是否需要在我的 WebInvokeApp.config 中指定任何其他内容,例如任何配置/属性(例如 binding) ?

最佳答案

如果你想读取传入请求的原始主体,你应该将参数的类型定义为Stream,而不是string。下面的代码显示了一种实现您的场景的方法,以及位于 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",
ResponseFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.Bare,
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, 0, 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 字符串(应该用引号引起来 - "a test message" 改为 JSON 字符串)。

关于c# - 如何读取发布到 REST Web 服务的 HttpRequest 正文 - C# WCF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25377059/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com