模拟POST请求调用WCF

  • web.config中的相关配置
复制代码
 1 <?xml version="1.0" encoding="utf-8"?>
 2 <configuration>
 3   <system.serviceModel>
 4     <services>     
 5       <service behaviorConfiguration="JHSoft.WCF.ServiceBehavior" name="JHSoft.WCF.POSTServiceForApp">
 6         <endpoint address="" behaviorConfiguration="webHttp" binding="webHttpBinding"
 7           name="post" contract="JHSoft.WCF.Contract.IPOSTServiceForApp"/>
 8         <endpoint address="mex" binding="mexHttpBinding" name="mex" contract="IMetadataExchange"/>
 9       </service>      
10     </services>
11     <behaviors>
12       <endpointBehaviors>
13         <behavior name="webHttp">
14           <webHttp />
15           <!--<enableWebScript />如果需要支持脚本调用请启用此项-->
16         </behavior>
17       </endpointBehaviors>
18       <serviceBehaviors>
19         <behavior name="JHSoft.WCF.ServiceBehavior">
20           <serviceMetadata httpGetEnabled="true"/>
21           <serviceDebug includeExceptionDetailInFaults="true"/>
22         </behavior>
23       </serviceBehaviors>
24     </behaviors>
25     <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
26   </system.serviceModel>
27 </configuration>
复制代码

有几点需要特别说明一下:

1) <endpoint binding="webHttpBinding"

这里必须设置为webHttpBinding,否则不可以通过post调用。如果想通过Flex调用,必须设置为basicHttpBinding,因为

目前Flex只能支持SOAP1.1。创建wcf服务时默认的模式为wsHttpBinding,如果是通过添加服务代理模式调用就不需要进

行修改了。如果还有其他特殊的要求,比如说双工,可以设置其他的绑定模式。

2) <endpoint behaviorConfiguration="webHttp"

1  <endpointBehaviors>
2     <behavior name="webHttp">
3        <webHttp />
4       <!--<enableWebScript />-->
5    </behavior>
6  </endpointBehaviors>

启用<webHttp />,或者<enableWebScript />,如果只是想通过post方式调用wcf而不需要支持脚本调用可以只启用

<webHttp />,如果还希望能支持脚本调用就需要启用<enableWebScript />,但是可能存在跨越调用的问题。不过在实际测试的过程中发现,如果只启用<webHttp />返回的json数据格式为:{Error:0,ErrorMessage:"",UID:"1001"}

如果启用了<enableWebScript />返回的数据格式则会变为

{d:{__type:"User#WCF.App"Error:0,ErrorMessage:"",UID:"1001"}}

3)<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>

启用ASP.NET兼容模式

  • WCF服务中的配置

1)在接口契约的方法上增加属性

[OperationContract]
[WebInvoke(RequestFormat = WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json,
Method = "POST",
BodyStyle = WebMessageBodyStyle.WrappedRequest)]
BackInfo Authorize(string sign);
RequestFormat = WebMessageFormat.Json   请求数据格式
ResponseFormat = WebMessageFormat.Json   回传数据格式
Method = "POST"   调用方式   
BodyStyle = WebMessageBodyStyle.WrappedRequest  这里必须设置为WrappedRequest

2)在实现接口契约的类头部增加属性

 [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
 public class POSTServiceForApp : IPOSTServiceForApp

开启ASP.Net兼容性

  • POST调用

通过以上配置就可以实现POST调用了

复制代码
public static string SendHttpRequest(string requestURI, string requestMethod, string json)
{
  //json格式请求数据
  string requestData = json;  
  //拼接URL
  string serviceUrl = string.Format("{0}/{1}", requestURI, requestMethod);
  HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(serviceUrl);
  //utf-8编码
  byte[] buf = System.Text.Encoding.GetEncoding("UTF-8").GetBytes(requestData);
  
  //post请求
  myRequest.Method = "POST";
  myRequest.ContentLength = buf.Length;
  //指定为json否则会出错
  myRequest.ContentType = "application/json";
  myRequest.MaximumAutomaticRedirections = 1;
  myRequest.AllowAutoRedirect = true;

  Stream newStream = myRequest.GetRequestStream();
  newStream.Write(buf, 0, buf.Length);
  newStream.Close();

  //获得接口返回值,格式为: {"VerifyResult":"aksjdfkasdf"} 
  HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();
  StreamReader reader = new StreamReader(myResponse.GetResponseStream(), Encoding.UTF8);
  string ReqResult = reader.ReadToEnd();
  reader.Close();
  myResponse.Close();
  return ReqResult;            
}
复制代码

1)myRequest.Method = "POST";

2)myRequest.ContentType = "application/json";

3)byte[] buf = System.Text.Encoding.GetEncoding("UTF-8").GetBytes(requestData);



  • 其他问题

1)测试的WCF的宿主是IIS6.0,在调用过程中曾经遇到过400错误,后来发现是因为IIS启用了“集成Window验证”。勾掉此项问题解决。

2)如果想通过服务代理模式调用WCF调用结束之后必须关闭管道,否则可能会因为连接过多无法释放造成服务无法调用。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值