From 87c7ae51cb1eac60f3fcf48cd3ffd332be03cc29 Mon Sep 17 00:00:00 2001 From: fly-l <1420031550@qq.com> Date: Thu, 23 May 2024 17:25:27 +0800 Subject: [PATCH] =?UTF-8?q?2024-05-23=20=20=E4=BF=AE=E6=94=B9=E7=94=9F?= =?UTF-8?q?=E6=88=90=E8=AF=95=E5=8D=B7=E6=97=B6=E8=BF=94=E5=9B=9E=E6=8C=87?= =?UTF-8?q?=E5=AE=9A=E6=95=B0=E9=87=8F=E9=A2=98=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vs/SGGL_CD/v17/.wsuo | Bin 120832 -> 120832 bytes SGGL/BLL/API/APICommonService.cs | 18 +- SGGL/BLL/API/HSSE/APITestRecordService.cs | 8 +- SGGL/FineUIPro.Web/ErrLog.txt | 70 ++++++ SGGL/FineUIPro.Web/Web.config | 5 +- SGGL/Model/Model.csproj | 1 + SGGL/WebAPI/App_Start/SwaggerConfig.cs | 280 ++++++++++++++++++++++ SGGL/WebAPI/Global.asax.cs | 3 + SGGL/WebAPI/WebAPI.csproj | 8 + SGGL/WebAPI/packages.config | 3 + 10 files changed, 387 insertions(+), 9 deletions(-) create mode 100644 SGGL/WebAPI/App_Start/SwaggerConfig.cs diff --git a/.vs/SGGL_CD/v17/.wsuo b/.vs/SGGL_CD/v17/.wsuo index 7f123c3c68764a4659054060be6b48cbcfa8b57a..6f9702ec437166dfdb35dfd590af9fce026dd1e6 100644 GIT binary patch delta 1940 zcmbtUeN0~gk%GaF=pULrtuG5s(~4u=hA|m&IRL1&U^Qs zbMAS+`}>`Ca7;cpCO;jbx#O+BQCbG~awXYUg}370z5N9>!T@(!kxK}V% zehM!No2X{E^}!Lf1~mG2|CIq*F&=4$<>I5X90s;rR&cmqyGyJjs9KR;lM$7YTTw8k z!7bQts{te{W>lmweR{R8l&lOQ@(dzQ(f@Ggk;>_R_Jm~REbPd#j+F8WHn7a@L{1SS zCoiC)YmwDLd z-%KgAx&kon%ZHczS{SS;MAv2b>fQ*68@%*Mja~txjrW*n8reE$ZQ_0%jrVMzW~gmC zlphftqFWRl&(>Mm+P#9;>OC5@L856d=$k8{c9*qUbh}bXdn$P!4i?j;Ote{Tk!Y9O z;;_29Ee?;p+v1K?RavajsNE{sx}y=hQ+j6?$LXTI2OL$~p6c&5Z88PC;ZPq^7`I-b z)$)!R_Om1KbI1d=E#<}R4q@bwG04_?kT(%IW5b*cn&40HT5v=B$2n?)=C6J5fT?ga zbaKL-pu6ju8`}Se3M(8kW$UpID7}seZ-S0~#lfK11c~`PDg4drS}Ea6a4Ry^z@Xp! zH;Go|`Aaf?o%vj%h96zx&Lsl;d5&@rI$H)0A8VQHQ_z!H+3XK`AL&E__W$aNe@Lkg z_B_snISh5r=~iUOJD8H;#_^B#Pn`;riigJV*+$l65JXYvc8V^GM-=TAht2M`L~uBs{~Ll&oPB#mS@(%Y~?Z4bLLEL`%$uVzzzO$pi|$j{&$dr25-S}Ndr zTcPZ>>}$^}=>+th)=%m$(H~Ut<5%bq1Q!oL=RyN~+EPEMnWG0OMtt$*d7L)3c=a<} bbS{*}&(70Qm3fCZeC@(}-+nN3ZEEUIvX*t_ delta 1937 zcmb7EeQZ-z6u;;7&ApAbbnJD!uENUbM$r~uw~loiurA|6VYn715Lv=LN*MwPE+s%h zOh+(T0s+=Ta$^jMB4T1xaQ$P0KTH)hi-c_%V>5=}{xC+3B>d4B(FmT~57HpUcwWxC z_nvd^xxe#qZ|q88>`LL;AT0be^d~?CE|DsVV(zQg4i9_>c045A!WUIHMh)%Qs(MW? zF~;^03o;|f_70V1<;3%eA7x3Qc@eRRxRBUM{4l4a(Mapu@~_;4Mq%?T>F}VeSuI(k zDjKVaeOhRAc=;Dolt(rI9CWD3#Y&USNUB^^;dnOM1 zskkc&%kYqE+{6sDBiB5cye%i-BEh*1NQb$d1O@{BP1;3DB^v>tk~kL}My(`$G6L%& zGU*@|1oR1V;6$(<1CHbTm1)q?C7CZQ0e)>7YQ#Jds7yi*;w|OB(IryLgMe!_{pmHr z)bo^Djm{NN1!Yp}Zl^4%-dxgFoB?<$u(;EbP@Pd2Iw<2{m18KlBOmG{tsI>L^!^=vQO&vvsFted?+oh7cUGtyAEQtu7>J+-e-(eEx0d!@=Oa3tLX}S1-a?V(bS$V5P&x-mVg{1@<5^fQ zeoMuUrTqIDXyOC26lKkASeIEQr@>8vPiA2`E~>O927~k9!jCE+y9VlrD#5RSfyN|Q zaGM+qMSt>yZeo+LQ_7#ot?lP~l8 z%|Ly5b^#{0E8KCD!W}+U!@I^|qmaOLK6De#!$to3n{bls6uk4kh0a-t?|xp#&yIqF zpPPV2oZ1`aAL-yC)p_jh3Grj&;NvHz;22DC?+Lifbq6?kYzkx^Z=e_9%B41pO`7>+ zEfmwHQ4D<>;&=N%=f6!t`FkBc!2WpINZHr$i%DDyKh6c4_|+LG!+j1bFP(<|5sIk~ SGTlQxvnQ`V@_L9gb$ /// 文件名 diff --git a/SGGL/BLL/API/HSSE/APITestRecordService.cs b/SGGL/BLL/API/HSSE/APITestRecordService.cs index 18d43466..221c24c5 100644 --- a/SGGL/BLL/API/HSSE/APITestRecordService.cs +++ b/SGGL/BLL/API/HSSE/APITestRecordService.cs @@ -327,19 +327,19 @@ namespace BLL if (getTestTrainingItems.Count() > 0) { ////单选题 - var getSItem = getTestTrainingItems.Where(x => x.TestType == "1").OrderBy(x => Guid.NewGuid()); + var getSItem = getTestTrainingItems.Where(x => x.TestType == "1").OrderBy(x => Guid.NewGuid()).Take(sumTestType1Count); if (getSItem.Count() > 0) { getTestTrainingItemList.AddRange(getSItem); } ///多选题 - var getMItem = getTestTrainingItems.Where(x => x.TestType == "2").OrderBy(x => Guid.NewGuid()); + var getMItem = getTestTrainingItems.Where(x => x.TestType == "2").OrderBy(x => Guid.NewGuid()).Take(sumTestType2Count); if (getMItem.Count() > 0) { getTestTrainingItemList.AddRange(getMItem); } ///判断题 - var getJItem = getTestTrainingItems.Where(x => x.TestType == "3").OrderBy(x => Guid.NewGuid()); + var getJItem = getTestTrainingItems.Where(x => x.TestType == "3").OrderBy(x => Guid.NewGuid()).Take(sumTestType3Count); if (getJItem.Count() > 0) { getTestTrainingItemList.AddRange(getJItem); @@ -365,7 +365,7 @@ namespace BLL { getTestTrainingItemList.AddRange(getSItemD); } - } + } ///多选题 if (getDiffTestType2Count > 0) { diff --git a/SGGL/FineUIPro.Web/ErrLog.txt b/SGGL/FineUIPro.Web/ErrLog.txt index ad845320..20219e5d 100644 --- a/SGGL/FineUIPro.Web/ErrLog.txt +++ b/SGGL/FineUIPro.Web/ErrLog.txt @@ -2428,3 +2428,73 @@ IP地址:::1 出错时间:05/12/2024 15:40:35 出错时间:05/12/2024 15:40:35 + +错误信息开始=====> +错误类型:SqlException +错误信息:列名 'IsExpertArgumentationIsAuditor' 无效。 +错误堆栈: + 在 System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) + 在 System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) + 在 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) + 在 System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) + 在 System.Data.SqlClient.SqlDataReader.TryConsumeMetaData() + 在 System.Data.SqlClient.SqlDataReader.get_MetaData() + 在 System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString, Boolean isInternal, Boolean forDescribeParameterEncryption, Boolean shouldCacheForAlwaysEncrypted) + 在 System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, Boolean inRetry, SqlDataReader ds, Boolean describeParameterEncryptionRequest) + 在 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean& usedCache, Boolean asyncWrite, Boolean inRetry) + 在 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) + 在 System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) + 在 System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior) + 在 System.Data.Common.DbCommand.ExecuteReader() + 在 System.Data.Linq.SqlClient.SqlProvider.Execute(Expression query, QueryInfo queryInfo, IObjectReaderFactory factory, Object[] parentArgs, Object[] userArgs, ICompiledSubQuery[] subQueries, Object lastResult) + 在 System.Data.Linq.SqlClient.SqlProvider.ExecuteAll(Expression query, QueryInfo[] queryInfos, IObjectReaderFactory factory, Object[] userArguments, ICompiledSubQuery[] subQueries) + 在 System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query) + 在 System.Data.Linq.Table`1.System.Linq.IQueryProvider.Execute[TResult](Expression expression) + 在 System.Linq.Queryable.FirstOrDefault[TSource](IQueryable`1 source, Expression`1 predicate) + 在 BLL.UserService.GetUserByUserId(String userId) 位置 D:\数据\诺必达\成达\test\sggl_cd\SGGL\BLL\SysManage\UserService.cs:行号 19 + 在 FineUIPro.Web.Global.Application_Start(Object sender, EventArgs e) 位置 D:\数据\诺必达\成达\test\sggl_cd\SGGL\FineUIPro.Web\Global.asax.cs:行号 31 +出错时间:05/23/2024 16:13:46 +出错时间:05/23/2024 16:13:46 + + +错误信息开始=====> +错误类型:HttpException +错误信息:文件“/SysManage/HttpLogEdit.aspx”不存在。 +错误堆栈: + 在 System.Web.UI.Util.CheckVirtualFileExists(VirtualPath virtualPath) + 在 System.Web.Compilation.BuildManager.GetVPathBuildResultInternal(VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile, Boolean throwIfNotFound, Boolean ensureIsUpToDate) + 在 System.Web.Compilation.BuildManager.GetVPathBuildResultWithNoAssert(HttpContext context, VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile, Boolean throwIfNotFound, Boolean ensureIsUpToDate) + 在 System.Web.Compilation.BuildManager.GetVirtualPathObjectFactory(VirtualPath virtualPath, HttpContext context, Boolean allowCrossApp, Boolean throwIfNotFound) + 在 System.Web.Compilation.BuildManager.CreateInstanceFromVirtualPath(VirtualPath virtualPath, Type requiredBaseType, HttpContext context, Boolean allowCrossApp) + 在 System.Web.UI.PageHandlerFactory.GetHandlerHelper(HttpContext context, String requestType, VirtualPath virtualPath, String physicalPath) + 在 System.Web.UI.PageHandlerFactory.GetHandler(HttpContext context, String requestType, String virtualPath, String path) + 在 System.Web.HttpApplication.MaterializeHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() + 在 System.Web.HttpApplication.ExecuteStepImpl(IExecutionStep step) + 在 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +出错时间:05/23/2024 16:40:09 +出错文件:http://localhost:1295/SysManage/HttpLogEdit.aspx?HttpLogId=2c336354-b9c0-427b-aa58-5a32db244fb3 +IP地址:::1 + +出错时间:05/23/2024 16:40:09 + + +错误信息开始=====> +错误类型:HttpException +错误信息:文件“/SysManage/HttpLogEdit.aspx”不存在。 +错误堆栈: + 在 System.Web.UI.Util.CheckVirtualFileExists(VirtualPath virtualPath) + 在 System.Web.Compilation.BuildManager.GetVPathBuildResultInternal(VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile, Boolean throwIfNotFound, Boolean ensureIsUpToDate) + 在 System.Web.Compilation.BuildManager.GetVPathBuildResultWithNoAssert(HttpContext context, VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile, Boolean throwIfNotFound, Boolean ensureIsUpToDate) + 在 System.Web.Compilation.BuildManager.GetVirtualPathObjectFactory(VirtualPath virtualPath, HttpContext context, Boolean allowCrossApp, Boolean throwIfNotFound) + 在 System.Web.Compilation.BuildManager.CreateInstanceFromVirtualPath(VirtualPath virtualPath, Type requiredBaseType, HttpContext context, Boolean allowCrossApp) + 在 System.Web.UI.PageHandlerFactory.GetHandlerHelper(HttpContext context, String requestType, VirtualPath virtualPath, String physicalPath) + 在 System.Web.UI.PageHandlerFactory.GetHandler(HttpContext context, String requestType, String virtualPath, String path) + 在 System.Web.HttpApplication.MaterializeHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() + 在 System.Web.HttpApplication.ExecuteStepImpl(IExecutionStep step) + 在 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +出错时间:05/23/2024 16:40:13 +出错文件:http://localhost:1295/SysManage/HttpLogEdit.aspx?HttpLogId=2c336354-b9c0-427b-aa58-5a32db244fb3 +IP地址:::1 + +出错时间:05/23/2024 16:40:13 + diff --git a/SGGL/FineUIPro.Web/Web.config b/SGGL/FineUIPro.Web/Web.config index 59b589e3..eae7269d 100644 --- a/SGGL/FineUIPro.Web/Web.config +++ b/SGGL/FineUIPro.Web/Web.config @@ -188,10 +188,7 @@ - - - - + \ No newline at end of file diff --git a/SGGL/Model/Model.csproj b/SGGL/Model/Model.csproj index 5535cd01..4a6ca202 100644 --- a/SGGL/Model/Model.csproj +++ b/SGGL/Model/Model.csproj @@ -31,6 +31,7 @@ prompt 4 false + bin\Debug\Model.xml pdbonly diff --git a/SGGL/WebAPI/App_Start/SwaggerConfig.cs b/SGGL/WebAPI/App_Start/SwaggerConfig.cs new file mode 100644 index 00000000..23040921 --- /dev/null +++ b/SGGL/WebAPI/App_Start/SwaggerConfig.cs @@ -0,0 +1,280 @@ +using System.Linq; +using System.Web.Http; +using WebActivatorEx; +using WebAPI; +using Swashbuckle.Application; +using System.Web.Http.Description; +using System; + +[assembly: PreApplicationStartMethod(typeof(SwaggerConfig), "Register")] + +namespace WebAPI +{ + public class SwaggerConfig + { + public static void Register() + { + var thisAssembly = typeof(SwaggerConfig).Assembly; + + GlobalConfiguration.Configuration + .EnableSwagger(c => + { + // By default, the service root url is inferred from the request used to access the docs. + // However, there may be situations (e.g. proxy and load-balanced environments) where this does not + // resolve correctly. You can workaround this by providing your own code to determine the root URL. + // + //c.RootUrl(req => GetRootUrlFromAppConfig()); + + // If schemes are not explicitly provided in a Swagger 2.0 document, then the scheme used to access + // the docs is taken as the default. If your API supports multiple schemes and you want to be explicit + // about them, you can use the "Schemes" option as shown below. + // + //c.Schemes(new[] { "http", "https" }); + + // Use "SingleApiVersion" to describe a single version API. Swagger 2.0 includes an "Info" object to + // hold additional metadata for an API. Version and title are required but you can also provide + // additional fields by chaining methods off SingleApiVersion. + // + c.SingleApiVersion("v1", "WebAPI"); + + + // If you want the output Swagger docs to be indented properly, enable the "PrettyPrint" option. + // + //c.PrettyPrint(); + + // If your API has multiple versions, use "MultipleApiVersions" instead of "SingleApiVersion". + // In this case, you must provide a lambda that tells Swashbuckle which actions should be + // included in the docs for a given API version. Like "SingleApiVersion", each call to "Version" + // returns an "Info" builder so you can provide additional metadata per API version. + // + /* c.MultipleApiVersions( + (apiDesc, targetApiVersion) => ResolveVersionSupportByRouteConstraint(apiDesc, targetApiVersion), + (vc) => + { + vc.Version("Cqms", "ͬ"); + vc.Version("Hsse", "ȫͬ"); + vc.Version("ProjectDataSync", "ĿϢͬ"); + vc.Version("v1", "Swashbuckle Dummy API V1"); + });*/ + + // You can use "BasicAuth", "ApiKey" or "OAuth2" options to describe security schemes for the API. + // See https://github.com/swagger-api/swagger-spec/blob/master/versions/2.0.md for more details. + // NOTE: These only define the schemes and need to be coupled with a corresponding "security" property + // at the document or operation level to indicate which schemes are required for an operation. To do this, + // you'll need to implement a custom IDocumentFilter and/or IOperationFilter to set these properties + // according to your specific authorization implementation + // + //c.BasicAuth("basic") + // .Description("Basic HTTP Authentication"); + // + // NOTE: You must also configure 'EnableApiKeySupport' below in the SwaggerUI section + c.ApiKey("token") + .Description("API Key Authentication") + .Name("token") + .In("header"); + // + //c.OAuth2("oauth2") + // .Description("OAuth2 Implicit Grant") + // .Flow("implicit") + // .AuthorizationUrl("http://petstore.swagger.wordnik.com/api/oauth/dialog") + // //.TokenUrl("https://tempuri.org/token") + // .Scopes(scopes => + // { + // scopes.Add("read", "Read access to protected resources"); + // scopes.Add("write", "Write access to protected resources"); + // }); + + // Set this flag to omit descriptions for any actions decorated with the Obsolete attribute + //c.IgnoreObsoleteActions(); + + // Each operation be assigned one or more tags which are then used by consumers for various reasons. + // For example, the swagger-ui groups operations according to the first tag of each operation. + // By default, this will be controller name but you can use the "GroupActionsBy" option to + // override with any value. + // + //c.GroupActionsBy(apiDesc => apiDesc.HttpMethod.ToString()); + + // You can also specify a custom sort order for groups (as defined by "GroupActionsBy") to dictate + // the order in which operations are listed. For example, if the default grouping is in place + // (controller name) and you specify a descending alphabetic sort order, then actions from a + // ProductsController will be listed before those from a CustomersController. This is typically + // used to customize the order of groupings in the swagger-ui. + // + //c.OrderActionGroupsBy(new DescendingAlphabeticComparer()); + + // If you annotate Controllers and API Types with + // Xml comments (http://msdn.microsoft.com/en-us/library/b2s063f7(v=vs.110).aspx), you can incorporate + // those comments into the generated docs and UI. You can enable this by providing the path to one or + // more Xml comment files. + // + + c.IncludeXmlComments(GetXmlCommentsPath("Model")); + c.IncludeXmlComments(GetXmlCommentsPath(thisAssembly.GetName().Name)); + + // Swashbuckle makes a best attempt at generating Swagger compliant JSON schemas for the various types + // exposed in your API. However, there may be occasions when more control of the output is needed. + // This is supported through the "MapType" and "SchemaFilter" options: + // + // Use the "MapType" option to override the Schema generation for a specific type. + // It should be noted that the resulting Schema will be placed "inline" for any applicable Operations. + // While Swagger 2.0 supports inline definitions for "all" Schema types, the swagger-ui tool does not. + // It expects "complex" Schemas to be defined separately and referenced. For this reason, you should only + // use the "MapType" option when the resulting Schema is a primitive or array type. If you need to alter a + // complex Schema, use a Schema filter. + // + //c.MapType(() => new Schema { type = "integer", format = "int32" }); + + // If you want to post-modify "complex" Schemas once they've been generated, across the board or for a + // specific type, you can wire up one or more Schema filters. + // + //c.SchemaFilter(); + + // In a Swagger 2.0 document, complex types are typically declared globally and referenced by unique + // Schema Id. By default, Swashbuckle does NOT use the full type name in Schema Ids. In most cases, this + // works well because it prevents the "implementation detail" of type namespaces from leaking into your + // Swagger docs and UI. However, if you have multiple types in your API with the same class name, you'll + // need to opt out of this behavior to avoid Schema Id conflicts. + // + c.UseFullTypeNameInSchemaIds(); + + // Alternatively, you can provide your own custom strategy for inferring SchemaId's for + // describing "complex" types in your API. + // + //c.SchemaId(t => t.FullName.Contains('`') ? t.FullName.Substring(0, t.FullName.IndexOf('`')) : t.FullName); + + // Set this flag to omit schema property descriptions for any type properties decorated with the + // Obsolete attribute + //c.IgnoreObsoleteProperties(); + + // In accordance with the built in JsonSerializer, Swashbuckle will, by default, describe enums as integers. + // You can change the serializer behavior by configuring the StringToEnumConverter globally or for a given + // enum type. Swashbuckle will honor this change out-of-the-box. However, if you use a different + // approach to serialize enums as strings, you can also force Swashbuckle to describe them as strings. + // + //c.DescribeAllEnumsAsStrings(); + + // Similar to Schema filters, Swashbuckle also supports Operation and Document filters: + // + // Post-modify Operation descriptions once they've been generated by wiring up one or more + // Operation filters. + // + //c.OperationFilter(); + // + // If you've defined an OAuth2 flow as described above, you could use a custom filter + // to inspect some attribute on each action and infer which (if any) OAuth2 scopes are required + // to execute the operation + // + //c.OperationFilter(); + + // Post-modify the entire Swagger document by wiring up one or more Document filters. + // This gives full control to modify the final SwaggerDocument. You should have a good understanding of + // the Swagger 2.0 spec. - https://github.com/swagger-api/swagger-spec/blob/master/versions/2.0.md + // before using this option. + // + //c.DocumentFilter(); + + // In contrast to WebApi, Swagger 2.0 does not include the query string component when mapping a URL + // to an action. As a result, Swashbuckle will raise an exception if it encounters multiple actions + // with the same path (sans query string) and HTTP method. You can workaround this by providing a + // custom strategy to pick a winner or merge the descriptions for the purposes of the Swagger docs + // + c.ResolveConflictingActions(apiDescriptions => apiDescriptions.First()); + + // Wrap the default SwaggerGenerator with additional behavior (e.g. caching) or provide an + // alternative implementation for ISwaggerProvider with the CustomProvider option. + // + //c.CustomProvider((defaultProvider) => new CachingSwaggerProvider(defaultProvider)); + }) + .EnableSwaggerUi(c => + { + // Use the "DocumentTitle" option to change the Document title. + // Very helpful when you have multiple Swagger pages open, to tell them apart. + // + //c.DocumentTitle("My Swagger UI"); + + // Use the "InjectStylesheet" option to enrich the UI with one or more additional CSS stylesheets. + // The file must be included in your project as an "Embedded Resource", and then the resource's + // "Logical Name" is passed to the method as shown below. + // + //c.InjectStylesheet(containingAssembly, "Swashbuckle.Dummy.SwaggerExtensions.testStyles1.css"); + + // Use the "InjectJavaScript" option to invoke one or more custom JavaScripts after the swagger-ui + // has loaded. The file must be included in your project as an "Embedded Resource", and then the resource's + // "Logical Name" is passed to the method as shown above. + // + //c.InjectJavaScript(thisAssembly, "Swashbuckle.Dummy.SwaggerExtensions.testScript1.js"); + + // The swagger-ui renders boolean data types as a dropdown. By default, it provides "true" and "false" + // strings as the possible choices. You can use this option to change these to something else, + // for example 0 and 1. + // + //c.BooleanValues(new[] { "0", "1" }); + + // By default, swagger-ui will validate specs against swagger.io's online validator and display the result + // in a badge at the bottom of the page. Use these options to set a different validator URL or to disable the + // feature entirely. + //c.SetValidatorUrl("http://localhost/validator"); + //c.DisableValidator(); + + // Use this option to control how the Operation listing is displayed. + // It can be set to "None" (default), "List" (shows operations for each resource), + // or "Full" (fully expanded: shows operations and their details). + // + //c.DocExpansion(DocExpansion.List); + + // Specify which HTTP operations will have the 'Try it out!' option. An empty paramter list disables + // it for all operations. + // + //c.SupportedSubmitMethods("GET", "HEAD"); + + // Use the CustomAsset option to provide your own version of assets used in the swagger-ui. + // It's typically used to instruct Swashbuckle to return your version instead of the default + // when a request is made for "index.html". As with all custom content, the file must be included + // in your project as an "Embedded Resource", and then the resource's "Logical Name" is passed to + // the method as shown below. + // + //c.CustomAsset("index", containingAssembly, "YourWebApiProject.SwaggerExtensions.index.html"); + + // If your API has multiple versions and you've applied the MultipleApiVersions setting + // as described above, you can also enable a select box in the swagger-ui, that displays + // a discovery URL for each version. This provides a convenient way for users to browse documentation + // for different API versions. + // + c.EnableDiscoveryUrlSelector(); + // If your API supports the OAuth2 Implicit flow, and you've described it correctly, according to + // the Swagger 2.0 specification, you can enable UI support as shown below. + // + //c.EnableOAuth2Support( + // clientId: "test-client-id", + // clientSecret: null, + // realm: "test-realm", + // appName: "Swagger UI" + // //additionalQueryStringParams: new Dictionary() { { "foo", "bar" } } + //); + + // If your API supports ApiKey, you can override the default values. + // "apiKeyIn" can either be "query" or "header" + // + c.EnableApiKeySupport("token", "header"); + }); + } + + /// + /// ض汾µĽӿ + /// + /// + /// + /// + private static bool ResolveVersionSupportByRouteConstraint(ApiDescription apiDesc, string targetApiVersion) + { + //var controllerFullName = apiDesc.ActionDescriptor.ControllerDescriptor.ControllerType.FullName; + //return controllerFullName.Split('.').Contains(targetApiVersion, StringComparer.OrdinalIgnoreCase); + var controllerFullName = apiDesc.ActionDescriptor.ControllerDescriptor.ControllerName; + return controllerFullName.Contains(targetApiVersion); + } + protected static string GetXmlCommentsPath(string name) + { + return System.String.Format(@"{0}\bin\{1}.xml", System.AppDomain.CurrentDomain.BaseDirectory, name); + } + } +} diff --git a/SGGL/WebAPI/Global.asax.cs b/SGGL/WebAPI/Global.asax.cs index e284f7d9..865b05d7 100644 --- a/SGGL/WebAPI/Global.asax.cs +++ b/SGGL/WebAPI/Global.asax.cs @@ -9,6 +9,7 @@ using System.Web.Routing; using System.Configuration; using BLL; using WebAPI.Common; +using WebAPI.Log; namespace WebAPI { @@ -33,6 +34,8 @@ namespace WebAPI //PersonKqSocketSersvices.init(1000); // 使api返回为json GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear(); + + GlobalConfiguration.Configuration.MessageHandlers.Add(new CustomMessageHandler()); } diff --git a/SGGL/WebAPI/WebAPI.csproj b/SGGL/WebAPI/WebAPI.csproj index ba83f83b..46e43f6f 100644 --- a/SGGL/WebAPI/WebAPI.csproj +++ b/SGGL/WebAPI/WebAPI.csproj @@ -76,6 +76,9 @@ ..\packages\StackExchange.Redis.2.6.70\lib\net461\StackExchange.Redis.dll + + ..\packages\Swashbuckle.Core.5.6.0\lib\net40\Swashbuckle.Core.dll + ..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll @@ -174,6 +177,9 @@ ..\packages\Microsoft.AspNet.WebPages.3.2.4\lib\net45\System.Web.WebPages.Razor.dll + + ..\packages\WebActivatorEx.2.0\lib\net40\WebActivatorEx.dll + True ..\packages\WebGrease.1.6.0\lib\WebGrease.dll @@ -188,6 +194,7 @@ + @@ -290,6 +297,7 @@ Global.asax + diff --git a/SGGL/WebAPI/packages.config b/SGGL/WebAPI/packages.config index 78bc7014..0d0f2140 100644 --- a/SGGL/WebAPI/packages.config +++ b/SGGL/WebAPI/packages.config @@ -29,6 +29,8 @@ + + @@ -39,5 +41,6 @@ + \ No newline at end of file