我想利用我的WCF REST服务中的WebScriptEnablingBehavior
来提供生成javascript客户端代理(以及随之而来的强类型对象)的能力。
它适用于GET
和client.DownloadData()
方法(作为查询字符串传递的参数),但我很难使其与POST
和client.UploadData(...)
一起使用。
问题是我的服务方法中的参数end-up都是null(没有错误/异常,我可以通过它调试就好......它们只是null)。
web.config
文件
<services>
<service behaviorConfiguration="ServiceBehavior" name="ServWS_Main_2.WS_Main_2">
<endpoint address="" behaviorConfiguration="JSONOnly" binding="webHttpBinding"
bindingConfiguration="StreamedRequestWebBinding" contract="ServWS_Main_2.IServWS" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="ServiceBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="JSONOnly">
<enableWebScript/>
</behavior>
</endpointBehaviors>
</behaviors>
服务合同
[ServiceContract]
public interface IServWS
{
[OperationContract]
[WebInvoke(Method = "POST")]
ProviderInfo AddTo(string serviceName, BubbleInfo bubble);
}
实施
public class WS_Main_2 : IServWS
{
public ProviderInfo AddTo(string serviceName, BubbleInfo bubble)
{
// at this point both serviceName and bubble are null
}
}
作为参数
传递的复杂类型的定义[DataContract]
public class BubbleInfo
{
[DataMember(EmitDefaultValue = false)]
public string Text { get; set; }
[DataMember(EmitDefaultValue = false)]
public string Caption { get; set; }
}
来自客户的电话
BubbleInfo bub = new BubbleInfo() { Text = "test2" };
MemoryStream stream = new MemoryStream();
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(BubbleInfo));
serializer.WriteObject(stream, bub);
var url = GetURL() + "/addto?serviceName=MyService";
byte[] data = client.UploadData(url, "POST", stream.ToArray());
请注意,如果我不使用WebScriptEnablingBehavior
,而是webHttp
和URITemplate
,则可以正常使用。
使用Visual Studio内置Web服务器以及IIS Express 7.5进行测试。
感谢。
答案 0 :(得分:0)
我认为这与请求消息的“正文样式”有关。当服务实际需要“包装”消息时(在JSON周围通常是参数名称的额外包装器),您可能会向服务发送“裸”JSON消息。
您需要注意的是WebInvokeAttribute.BodyStyle
属性。它获取并设置发送到服务操作和从服务操作发送的消息的主体样式。它控制是否包装发送到属性所应用的服务操作和从其接收的请求和响应。通常,返回的JSON由JavaScript函数包装,可以跨域执行,因此您可能需要通过切换到“裸”的体型来删除它。
如果将WebInvokeAttribute上的BodyStyle属性显式设置为Bare或Wrapped会发生什么情况,然后重试?这能解决你的问题吗?我认为应该!