之前发过一篇随笔,说的WCF配置文件配置问题。里面也配了跨域支持,但是jsoncollback只支持Get请求,Post请求是解决不了,所以这里把真正的WCF跨域问题贴出来。

话不多说,直接帖配置文件。

   <system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Headers" value="Content-Type" />
<add name="Access-Control-Allow-Methods" value="GET, POST,PUT, DELETE, OPTIONS" />
</customHeaders>
</httpProtocol>
<modules runAllManagedModulesForAllRequests="true" />
<!--
若要在调试过程中浏览 Web 应用程序根目录,请将下面的值设置为 True。
在部署之前将该值设置为 False 可避免泄露 Web 应用程序文件夹信息。
-->
<directoryBrowse enabled="true" />
<!--<handlers>
-->
<!--移除 IIS下的OPTIONSVerbHandler Handle Mapping 解决跨域问题-->
<!--
<remove name="OPTIONSVerbHandler" />
</handlers>-->
</system.webServer>

Http进行Post请求时得先发送一次OPTIONS请求,与服务器进行跨域验证请求,服务器验证通过后才会发送需要发送的Post请求完成整个接口请求过程。

因此这里必须先处理客户端发送的OPTIONS请求。

除了上面的配置文件外,还需在Global里面加上处理请求的方法。代码这里

      /// <summary>
/// 移动跨域请求,会请求两次,第一次OPTIONS 空数据请求,为了获取是否允许跨域,第二次才是带数据请求,所以为了避免程序上一些Bug,空请求时就直接返回,不需要经过业务处理.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void Application_BeginRequest(object sender, EventArgs e)
{
if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
{
Response.End();
}
}

--------------------------------------------------------------不华丽的分割线--------------------------------------------

这里顺带说一下如果接口需要进行大文件传输,需要把传输管道容量开到最大的话这样配置,这里的配置是最大容量配置:

     <bindings>
<webHttpBinding>
<binding name="ServiceProxyBinding" closeTimeout="00:10:00" receiveTimeout="00:10:00" sendTimeout="00:30:00" maxBufferSize="" maxReceivedMessageSize="">
<readerQuotas maxStringContentLength="" />
</binding>
</webHttpBinding>
</bindings>

--------------------------------------------------------------不华丽的分割线--------------------------------------------

既然要多点东西的话把这个也留着吧:

  <runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-10.0.0.0" newVersion="10.0.0.0" />
</dependentAssembly> </assemblyBinding>
</runtime>

解决引用的包及项目版本包不匹配或者过低问题。

--------------------------------------------------------------不华丽的分割线--------------------------------------------

既然都说了那么多,那干脆把Log4也记在这里吧。

  <configSections>
<!-- 添加log4net 的配置 -->
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
</configSections>
  <!--实现log4net start-->
<log4net>
<!--错误日志-->
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="Log\\LogError\\" />
<appendToFile value="true" />
<rollingStyle value="Date" />
<datePattern value="yyyy\\yyyyMM\\yyyyMMdd'.txt'" />
<staticLogFileName value="false" />
<param name="MaxSizeRollBackups" value="" />
<layout type="log4net.Layout.PatternLayout">
<!--每条日志末尾的文字说明-->
<!--输出格式-->
<!--样例:-- ::, [] INFO Log4NetDemo.MainClass [(null)] - info-->
<conversionPattern value="%newline %n记录时间:%date %n线程ID:[%thread] %n日志级别: %-5level %n错误描述:%message%newline %n" />
</layout>
</appender> <!--Info日志-->
<appender name="InfoAppender" type="log4net.Appender.RollingFileAppender">
<param name="File" value="Log\\LogInfo\\" />
<param name="AppendToFile" value="true" />
<param name="MaxFileSize" value="" />
<param name="MaxSizeRollBackups" value="" />
<param name="StaticLogFileName" value="false" />
<param name="DatePattern" value="yyyy\\yyyyMM\\yyyyMMdd'.txt'" />
<param name="RollingStyle" value="Date" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%newline %n记录时间:%date %n线程ID:[%thread] %n日志级别: %-5level %n日志描述:%message%newline %n" />
</layout>
</appender> <!--监控日志-->
<appender name="MonitorAppender" type="log4net.Appender.RollingFileAppender">
<param name="File" value="Log\\LogMonitor\\" />
<param name="AppendToFile" value="true" />
<param name="MaxFileSize" value="" />
<param name="MaxSizeRollBackups" value="" />
<param name="StaticLogFileName" value="false" />
<param name="DatePattern" value="yyyy\\yyyyMM\\yyyyMMdd'.txt'" />
<param name="RollingStyle" value="Date" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%newline %n记录时间:%date %n线程ID:[%thread] %n日志级别: %-5level %n跟踪描述:%message%newline %n" />
</layout>
</appender> <!--Error日志-->
<logger name="LogError">
<level value="ERROR" />
<appender-ref ref="RollingLogFileAppender" />
</logger> <!--Info日志-->
<logger name="LogInfo">
<level value="INFO" />
<appender-ref ref="InfoAppender" />
</logger> <!--监控日志-->
<logger name="LogMonitor">
<level value="Monitor" />
<appender-ref ref="MonitorAppender" />
</logger>
</log4net>
<!--log4net end-->

一天一个日志文件,文件路径在项目的Log下面,有LogError和LogInfo两个文件夹存放不同的日志文件。

具体的LogHelp在这里:

using System;
using System.Collections.Generic;
using System.Data.Entity.Validation;
using System.Linq;
using System.Text; [assembly: log4net.Config.XmlConfigurator(Watch = true)]
namespace Test.Base
{
public class LoggerHelper
{
private static readonly log4net.ILog LogInfo = log4net.LogManager.GetLogger("LogInfo");
private static readonly log4net.ILog LogError = log4net.LogManager.GetLogger("LogError");
private static readonly log4net.ILog LogMonitor = log4net.LogManager.GetLogger("LogMonitor"); /// <summary>
/// 记录Error日志
/// </summary>
/// <param name="errorMsg"></param>
/// <param name="ex"></param>
public static void Error(string errorMsg, Exception ex = null)
{
if (ex != null)
{
if (ex.InnerException != null)
{
LogError.Error(errorMsg, ex.InnerException);
}
else
{
LogError.Error(errorMsg, ex);
}
}
else
{
LogError.Error(errorMsg);
}
} /// <summary>
/// 记录Info日志
/// </summary>
/// <param name="msg"></param>
/// <param name="ex"></param>
public static void Info(string msg, Exception ex = null)
{
if (ex != null)
{
LogInfo.Info(msg, ex);
}
else
{
LogInfo.Info(msg);
}
} /// <summary>
/// 记录Monitor日志
/// </summary>
/// <param name="msg"></param>
public static void Monitor(string msg)
{
LogMonitor.Info(msg);
}
}
}

要怎么改,怎么写,自己改嘛。

--------------------------------------------------------------不华丽的分割线--------------------------------------------

这里记录一位同事传授的在线api方法,感谢老哥,给予了太多帮助。

protected void Application_Start(object sender, EventArgs e)
{
SwaggerWCFInit();
RouteTable.Routes.Add(new ServiceRoute("Service", new WebServiceHostFactory(), typeof(Service)));
RouteTable.Routes.Add(new ServiceRoute("api", new WebServiceHostFactory(), typeof(SwaggerWcfEndpoint)));
//HibernatingRhinos.Profiler.Appender.EntityFramework.EntityFrameworkProfiler.Initialize();
} protected void SwaggerWCFInit()
{
InfoContact infoContact = new InfoContact { Name = "名字", Email = "邮箱", Url = "地址" };
InfoLicense infoLicense = new InfoLicense { Name = "", Url = "" };
Info info = new Info {
Title = "SampleService(备注信息)",
Description = "Sample Service to test SwaggerWCF",
Contact = infoContact,
License = infoLicense,
TermsOfService = "Terms of Service",
Version = "1.0.0",
};
//var security = new SecurityDefinitions
//{
// {
// "api-gateway", new SecurityAuthorization
// {
// Type = "oauth2",
// Name = "api-gateway",
// Description = "Forces authentication with credentials via an api gateway",
// Flow = "password",
// Scopes = new Dictionary<string, string>
// {
// { "author", "use author scope"},
// { "admin", "use admin scope"},
// },
// AuthorizationUrl = "http://yourapi.net/oauth/token"
// }
// }
//};
SwaggerWcfEndpoint.Configure(info);
}

嗯~~~,翻了一下,东西还是挺多的,打算重写一个吧,好好收集一下。

还有一些其它的帮助类都在这里:http://www.cnblogs.com/AV1973/p/8675257.html,希望能帮助到更多的人吧,程序员,都辛苦。

-----------------------~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~--------------------留笔。

WCF跨域解决方法及一些零碎的东西。的更多相关文章

  1. [转]vue跨域解决方法

      vue跨域解决方法 vue项目中,前端与后台进行数据请求或者提交的时候,如果后台没有设置跨域,前端本地调试代码的时候就会报“No 'Access-Control-Allow-Origin' hea ...

  2. JavaScript跨域解决方法大全

    跨域的定义:JavaScript出于安全性考虑,同源策略机制对跨域访问做了限制.域仅仅是通过“URL的首部”字符串进行识别,“URL的首部”指window.location.protocol +win ...

  3. ajax原理和跨域解决方法

    ajax是异步的 JavaScript 和 XML.通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新. 1--启动 ...

  4. vue+axios跨域解决方法

    通过这种方法也可以解决跨域的问题. 使用http-proxy-middleware 代理解决(项目使用vue-cli脚手架搭建) 例如请求的url:“http://f.apiplus.cn/bj11x ...

  5. vue跨域解决方法

    针对不在同一服务器,很可能出现跨域问题,解决方法 注意:修改了配置文件,需要重启才能生效

  6. cookie 跨域解决方法

    1.Nginx 正向和反向代理的区别 正向代理和反向代理的区别:正向代理隐藏真实客户端,反向代理隐藏真实服务端,图示: 2.cookie跨域问题 因为cookie存在跨域问题,其中一个解决方法是,设置 ...

  7. ajax 跨域解决方法

    最近在开发过程中,使用ajax去异步调取图片.在开发中这个功能没什么问题,可以后来提测,重新部署之后就有问题了,这就是ajax的跨域问题. ajax核心对象XMLHttpRequest本身是不支持跨域 ...

  8. [跨域]跨域解决方法之Ngnix反向代理

    跨域原理:http://www.cnblogs.com/Alear/p/8758331.html 介绍Ngnix之前,我么先来介绍下代理是什么~ 代理相当于中间人,中介的概念 代理分为正向代理和反向代 ...

  9. vue跨域解决方法 及设置api路径方法

    vue项目中,前端与后台进行数据请求或者提交的时候,如果后台没有设置跨域,前端本地调试代码的时候就会报“No 'Access-Control-Allow-Origin' header is prese ...

随机推荐

  1. insert ,update 以及merge 的使用

    本次将用到的几个表,以及字段> emp表 empno, ename,job,mgr,hiredate,sal,comm,deptno > dept表 deptno,dname,loc &g ...

  2. Caused by: java.lang.ClassNotFoundException: javax.persistence.NamedStoredProcedureQuery

    1.错误描述 2014-7-12 21:06:37 org.hibernate.engine.jdbc.internal.LobCreatorBuilder useContextualLobCreat ...

  3. Metrics.net + influxdb + grafana 构建WebAPI的自动化监控和预警

    前言 这次主要分享通过Metrics.net + influxdb + grafana 构建WebAPI的自动化监控和预警方案.通过执行耗时,定位哪些接口拖累了服务的性能:通过请求频次,设置适当的限流 ...

  4. (luogu P1410)子序列 [TPLY]

    子序列 题目链接:https://www.luogu.org/problemnew/show/P1410 吐槽: 这道题做得我心累 本来想好好练一练dp 刷刷水题来练练手感 于是乎打开了(普及+/提高 ...

  5. SPOJ:To the moon

    题面 vjudge Sol 主席树模板 # include <bits/stdc++.h> # define RG register # define IL inline # define ...

  6. [BZOJ2879] [Noi2012] 美食节 (费用流 & 动态加边)

    Description CZ市为了欢迎全国各地的同学,特地举办了一场盛大的美食节.作为一个喜欢尝鲜的美食客,小M自然不愿意错过这场盛宴.他很快就尝遍了美食节所有的美食.然而,尝鲜的欲望是难以满足的.尽 ...

  7. Vue-路由配置和使用步骤整理

    介绍 路由:控制组件之间的跳转,不会实现请求.不用页面刷新,直接跳转-切换组件>>> 安装 本地环境安装路由插件vue-router:    cnpm install vue-rou ...

  8. 微信小程序之换肤的功能

    pc或者移动端实现换肤功能还是比较简单的,大致就是需要换肤的css,还有正常的css:把当前皮肤类型存入本地:然后通过js读取并判断当前应该加载哪套css. 由于微信小程序没有操作wxss的api,所 ...

  9. 登录界面输入判断为空的bug

    这个bug我改了两天啊两天,直到大神帮我debug了一下... 这是之前出错的部分.. <script type="text/javascript" language=&qu ...

  10. webpack4: compilation.mainTemplate.applyPluginsWaterfall is not a function 解决方法

    今天捣鼓webpack4踩到一个弥天大坑:使用html-webpack-plugin打包html的时候一直报 compilation.mainTemplate.applyPluginsWaterfal ...