From ab6e620f8ef7a257f438d0ef9bbf226b8db3a01d Mon Sep 17 00:00:00 2001 From: XuJiacheng Date: Thu, 20 Nov 2025 15:56:30 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitattributes | 63 + .gitignore | 363 ++ BLWWS/BLWWS.csproj | 215 + BLWWS/Common.cs | 37 + BLWWS/Global.asax | 1 + BLWWS/Global.asax.cs | 50 + BLWWS/HttpSendData.cs | 89 + BLWWS/Id_G.cs | 93 + BLWWS/Properties/AssemblyInfo.cs | 35 + BLWWS/Properties/Settings.Designer.cs | 36 + BLWWS/Properties/Settings.settings | 9 + BLWWS/RestSharp/RestSharp.dll | Bin 0 -> 163328 bytes BLWWS/RestSharp/RestSharp.xml | 2897 ++++++++++ .../Web References/WebReference/Reference.cs | 154 + .../Web References/WebReference/Reference.map | 7 + .../WebReference/WebService1.disco | 6 + .../WebReference/WebService1.wsdl | 67 + BLWWS/Web.config | 54 + BLWWS/blwws.asmx | 1 + BLWWS/blwws.asmx.cs | 1282 +++++ BLWWS/job_scheduling_data_2_0.xsd | 364 ++ BLWWS/nlog.config | 35 + BLWWS/packages.config | 10 + BLWWS/syncstatus.asmx | 1 + BLWWS/syncstatus.asmx.cs | 311 + BLWWS_BLL/AliyunSMSHelper.cs | 70 + BLWWS_BLL/BLL.cs | 1228 ++++ BLWWS_BLL/BLWWS_BLL.csproj | 115 + BLWWS_BLL/GlobalCache.cs | 121 + BLWWS_BLL/HttpJob.cs | 30 + BLWWS_BLL/LogHelper.cs | 132 + BLWWS_BLL/LogHelperForService.cs | 54 + BLWWS_BLL/PmsInterface.cs | 20 + BLWWS_BLL/Properties/AssemblyInfo.cs | 36 + BLWWS_BLL/SqlHelper.cs | 4232 ++++++++++++++ BLWWS_BLL/SqlSugarBase.cs | 32 + BLWWS_BLL/Tools.cs | 160 + BLWWS_BLL/Uploadinfo.cs | 28 + BLWWS_BLL/app.config | 21 + BLWWS_BLL/job_scheduling_data_2_0.xsd | 364 ++ BLWWS_BLL/packages.config | 12 + BLWWS_BLL/pmsLog.cs | 22 + BLW_Interface_git.sln | 79 + ConsoleApp1/App.config | 26 + ConsoleApp1/ConsoleApp1.csproj | 103 + ConsoleApp1/Program.cs | 441 ++ ConsoleApp1/Properties/AssemblyInfo.cs | 33 + ConsoleApp1/packages.config | 12 + ConsoleApp2/ConsoleApp2.csproj | 22 + ConsoleApp2/Program.cs | 64 + ConsoleApp3/App.config | 22 + ConsoleApp3/ConsoleApp3.csproj | 63 + ConsoleApp3/Program.cs | 24 + ConsoleApp3/Properties/AssemblyInfo.cs | 33 + ConsoleApp3/packages.config | 4 + ConsoleApp4/App.config | 18 + ...ence1.ChangePhoneNumberResponse.datasource | 10 + ...viceReference1.CheckIn2Response.datasource | 10 + ...rviceReference1.CheckInResponse.datasource | 10 + ...viceReference1.CheckOutResponse.datasource | 10 + ...viceReference1.RentRoomResponse.datasource | 10 + ...eReference1.UploadPhotoResponse.datasource | 10 + .../ServiceReference1/Reference.cs | 879 +++ .../ServiceReference1/Reference.svcmap | 32 + .../ServiceReference1/blwws.disco | 6 + .../ServiceReference1/blwws.wsdl | 326 ++ .../ServiceReference1/configuration.svcinfo | 10 + .../ServiceReference1/configuration91.svcinfo | 201 + ConsoleApp4/ConsoleApp4.csproj | 100 + ConsoleApp4/Program.cs | 36 + ConsoleApp4/Properties/AssemblyInfo.cs | 33 + ConsoleApp5/App.config | 6 + ConsoleApp5/ConsoleApp5.csproj | 53 + ConsoleApp5/Program.cs | 17 + ConsoleApp5/Properties/AssemblyInfo.cs | 33 + ConsoleApp6/App.config | 23 + ConsoleApp6/ConsoleApp6.csproj | 98 + ConsoleApp6/Program.cs | 29 + ConsoleApp6/Properties/AssemblyInfo.cs | 33 + ConsoleApp6/Properties/Settings.Designer.cs | 36 + ConsoleApp6/Properties/Settings.settings | 9 + .../Web References/localhost/Reference.cs | 758 +++ .../Web References/localhost/Reference.map | 7 + .../Web References/localhost/blwws.disco | 6 + .../Web References/localhost/blwws.wsdl | 456 ++ ConsoleApp7/ConsoleApp7.csproj | 51 + ConsoleApp7/Program.cs | 51 + ConsoleApp7/Properties/AssemblyInfo.cs | 33 + HttpsTran/1.txt | 26 + HttpsTran/HttpsTran.csproj | 168 + HttpsTran/Properties/AssemblyInfo.cs | 35 + HttpsTran/Web.Debug.config | 31 + HttpsTran/Web.Release.config | 32 + HttpsTran/Web.config | 28 + HttpsTran/WebService1.asmx | 1 + HttpsTran/WebService1.asmx.cs | 84 + HttpsTran/nlog.config | 35 + HttpsTran/packages.config | 16 + MyQianLiMa/App_Start/WebApiConfig.cs | 24 + MyQianLiMa/Common/CSRedisCacheHelper.cs | 107 + ...Reference1.AddHotelInfoResponse.datasource | 10 + ...ence1.ChangePhoneNumberResponse.datasource | 10 + ...viceReference1.CheckIn2Response.datasource | 10 + ...rviceReference1.CheckInResponse.datasource | 10 + ...viceReference1.CheckOutResponse.datasource | 10 + ...GetPushBaoJing_IsEnableResponse.datasource | 10 + ...e1.PushBaoJing_IsEnableResponse.datasource | 10 + ...viceReference1.RentRoomResponse.datasource | 10 + ...eReference1.UploadPhotoResponse.datasource | 10 + .../ServiceReference1/Reference.cs | 1207 ++++ .../ServiceReference1/Reference.svcmap | 32 + .../ServiceReference1/blwws.disco | 6 + .../ServiceReference1/blwws.wsdl | 456 ++ .../ServiceReference1/configuration.svcinfo | 10 + .../ServiceReference1/configuration91.svcinfo | 201 + MyQianLiMa/Controllers/ValuesController.cs | 60 + MyQianLiMa/Global.asax | 1 + MyQianLiMa/Global.asax.cs | 401 ++ MyQianLiMa/Index.aspx | 17 + MyQianLiMa/Index.aspx.cs | 17 + MyQianLiMa/Index.aspx.designer.cs | 26 + MyQianLiMa/Job/GetTokenJob.cs | 24 + MyQianLiMa/MyQianLiMa.csproj | 242 + MyQianLiMa/NLog.xsd | 5039 +++++++++++++++++ MyQianLiMa/PMS/ConfigData.cs | 18 + MyQianLiMa/PMS/QHotelData.cs | 28 + MyQianLiMa/PMS/QianLiMaReturnInfo.cs | 43 + MyQianLiMa/Properties/AssemblyInfo.cs | 35 + MyQianLiMa/Web.Debug.config | 31 + MyQianLiMa/Web.Release.config | 32 + MyQianLiMa/Web.config | 82 + MyQianLiMa/WebForm1.aspx | 62 + MyQianLiMa/WebForm1.aspx.cs | 99 + MyQianLiMa/WebForm1.aspx.designer.cs | 107 + MyQianLiMa/config.json | 1 + MyQianLiMa/nlog.config | 35 + MyQianLiMa/packages.config | 18 + PMSLogProduce/.config/dotnet-tools.json | 13 + PMSLogProduce/CSRedisCacheHelper.cs | 91 + .../Controllers/WeatherForecastController.cs | 33 + PMSLogProduce/Models/Entity.cs | 222 + PMSLogProduce/PMSLogProduce.csproj | 17 + PMSLogProduce/PMSLogProduce.http | 6 + PMSLogProduce/Program.cs | 29 + PMSLogProduce/Properties/launchSettings.json | 31 + PMSLogProduce/Services/KafkaProduce.cs | 113 + PMSLogProduce/WeatherForecast.cs | 13 + PMSLogProduce/appsettings.Development.json | 8 + PMSLogProduce/appsettings.json | 14 + RestSharp/RestSharp.dll | Bin 0 -> 163328 bytes RestSharp/RestSharp.xml | 2897 ++++++++++ dll/AipSdk.dll | Bin 0 -> 53760 bytes dll/aliyun-net-sdk-core.dll | Bin 0 -> 61952 bytes dll/aliyun-net-sdk-dysmsapi.dll | Bin 0 -> 11776 bytes 154 files changed, 29677 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 BLWWS/BLWWS.csproj create mode 100644 BLWWS/Common.cs create mode 100644 BLWWS/Global.asax create mode 100644 BLWWS/Global.asax.cs create mode 100644 BLWWS/HttpSendData.cs create mode 100644 BLWWS/Id_G.cs create mode 100644 BLWWS/Properties/AssemblyInfo.cs create mode 100644 BLWWS/Properties/Settings.Designer.cs create mode 100644 BLWWS/Properties/Settings.settings create mode 100644 BLWWS/RestSharp/RestSharp.dll create mode 100644 BLWWS/RestSharp/RestSharp.xml create mode 100644 BLWWS/Web References/WebReference/Reference.cs create mode 100644 BLWWS/Web References/WebReference/Reference.map create mode 100644 BLWWS/Web References/WebReference/WebService1.disco create mode 100644 BLWWS/Web References/WebReference/WebService1.wsdl create mode 100644 BLWWS/Web.config create mode 100644 BLWWS/blwws.asmx create mode 100644 BLWWS/blwws.asmx.cs create mode 100644 BLWWS/job_scheduling_data_2_0.xsd create mode 100644 BLWWS/nlog.config create mode 100644 BLWWS/packages.config create mode 100644 BLWWS/syncstatus.asmx create mode 100644 BLWWS/syncstatus.asmx.cs create mode 100644 BLWWS_BLL/AliyunSMSHelper.cs create mode 100644 BLWWS_BLL/BLL.cs create mode 100644 BLWWS_BLL/BLWWS_BLL.csproj create mode 100644 BLWWS_BLL/GlobalCache.cs create mode 100644 BLWWS_BLL/HttpJob.cs create mode 100644 BLWWS_BLL/LogHelper.cs create mode 100644 BLWWS_BLL/LogHelperForService.cs create mode 100644 BLWWS_BLL/PmsInterface.cs create mode 100644 BLWWS_BLL/Properties/AssemblyInfo.cs create mode 100644 BLWWS_BLL/SqlHelper.cs create mode 100644 BLWWS_BLL/SqlSugarBase.cs create mode 100644 BLWWS_BLL/Tools.cs create mode 100644 BLWWS_BLL/Uploadinfo.cs create mode 100644 BLWWS_BLL/app.config create mode 100644 BLWWS_BLL/job_scheduling_data_2_0.xsd create mode 100644 BLWWS_BLL/packages.config create mode 100644 BLWWS_BLL/pmsLog.cs create mode 100644 BLW_Interface_git.sln create mode 100644 ConsoleApp1/App.config create mode 100644 ConsoleApp1/ConsoleApp1.csproj create mode 100644 ConsoleApp1/Program.cs create mode 100644 ConsoleApp1/Properties/AssemblyInfo.cs create mode 100644 ConsoleApp1/packages.config create mode 100644 ConsoleApp2/ConsoleApp2.csproj create mode 100644 ConsoleApp2/Program.cs create mode 100644 ConsoleApp3/App.config create mode 100644 ConsoleApp3/ConsoleApp3.csproj create mode 100644 ConsoleApp3/Program.cs create mode 100644 ConsoleApp3/Properties/AssemblyInfo.cs create mode 100644 ConsoleApp3/packages.config create mode 100644 ConsoleApp4/App.config create mode 100644 ConsoleApp4/Connected Services/ServiceReference1/ConsoleApp4.ServiceReference1.ChangePhoneNumberResponse.datasource create mode 100644 ConsoleApp4/Connected Services/ServiceReference1/ConsoleApp4.ServiceReference1.CheckIn2Response.datasource create mode 100644 ConsoleApp4/Connected Services/ServiceReference1/ConsoleApp4.ServiceReference1.CheckInResponse.datasource create mode 100644 ConsoleApp4/Connected Services/ServiceReference1/ConsoleApp4.ServiceReference1.CheckOutResponse.datasource create mode 100644 ConsoleApp4/Connected Services/ServiceReference1/ConsoleApp4.ServiceReference1.RentRoomResponse.datasource create mode 100644 ConsoleApp4/Connected Services/ServiceReference1/ConsoleApp4.ServiceReference1.UploadPhotoResponse.datasource create mode 100644 ConsoleApp4/Connected Services/ServiceReference1/Reference.cs create mode 100644 ConsoleApp4/Connected Services/ServiceReference1/Reference.svcmap create mode 100644 ConsoleApp4/Connected Services/ServiceReference1/blwws.disco create mode 100644 ConsoleApp4/Connected Services/ServiceReference1/blwws.wsdl create mode 100644 ConsoleApp4/Connected Services/ServiceReference1/configuration.svcinfo create mode 100644 ConsoleApp4/Connected Services/ServiceReference1/configuration91.svcinfo create mode 100644 ConsoleApp4/ConsoleApp4.csproj create mode 100644 ConsoleApp4/Program.cs create mode 100644 ConsoleApp4/Properties/AssemblyInfo.cs create mode 100644 ConsoleApp5/App.config create mode 100644 ConsoleApp5/ConsoleApp5.csproj create mode 100644 ConsoleApp5/Program.cs create mode 100644 ConsoleApp5/Properties/AssemblyInfo.cs create mode 100644 ConsoleApp6/App.config create mode 100644 ConsoleApp6/ConsoleApp6.csproj create mode 100644 ConsoleApp6/Program.cs create mode 100644 ConsoleApp6/Properties/AssemblyInfo.cs create mode 100644 ConsoleApp6/Properties/Settings.Designer.cs create mode 100644 ConsoleApp6/Properties/Settings.settings create mode 100644 ConsoleApp6/Web References/localhost/Reference.cs create mode 100644 ConsoleApp6/Web References/localhost/Reference.map create mode 100644 ConsoleApp6/Web References/localhost/blwws.disco create mode 100644 ConsoleApp6/Web References/localhost/blwws.wsdl create mode 100644 ConsoleApp7/ConsoleApp7.csproj create mode 100644 ConsoleApp7/Program.cs create mode 100644 ConsoleApp7/Properties/AssemblyInfo.cs create mode 100644 HttpsTran/1.txt create mode 100644 HttpsTran/HttpsTran.csproj create mode 100644 HttpsTran/Properties/AssemblyInfo.cs create mode 100644 HttpsTran/Web.Debug.config create mode 100644 HttpsTran/Web.Release.config create mode 100644 HttpsTran/Web.config create mode 100644 HttpsTran/WebService1.asmx create mode 100644 HttpsTran/WebService1.asmx.cs create mode 100644 HttpsTran/nlog.config create mode 100644 HttpsTran/packages.config create mode 100644 MyQianLiMa/App_Start/WebApiConfig.cs create mode 100644 MyQianLiMa/Common/CSRedisCacheHelper.cs create mode 100644 MyQianLiMa/Connected Services/ServiceReference1/MyQianLiMa.ServiceReference1.AddHotelInfoResponse.datasource create mode 100644 MyQianLiMa/Connected Services/ServiceReference1/MyQianLiMa.ServiceReference1.ChangePhoneNumberResponse.datasource create mode 100644 MyQianLiMa/Connected Services/ServiceReference1/MyQianLiMa.ServiceReference1.CheckIn2Response.datasource create mode 100644 MyQianLiMa/Connected Services/ServiceReference1/MyQianLiMa.ServiceReference1.CheckInResponse.datasource create mode 100644 MyQianLiMa/Connected Services/ServiceReference1/MyQianLiMa.ServiceReference1.CheckOutResponse.datasource create mode 100644 MyQianLiMa/Connected Services/ServiceReference1/MyQianLiMa.ServiceReference1.GetPushBaoJing_IsEnableResponse.datasource create mode 100644 MyQianLiMa/Connected Services/ServiceReference1/MyQianLiMa.ServiceReference1.PushBaoJing_IsEnableResponse.datasource create mode 100644 MyQianLiMa/Connected Services/ServiceReference1/MyQianLiMa.ServiceReference1.RentRoomResponse.datasource create mode 100644 MyQianLiMa/Connected Services/ServiceReference1/MyQianLiMa.ServiceReference1.UploadPhotoResponse.datasource create mode 100644 MyQianLiMa/Connected Services/ServiceReference1/Reference.cs create mode 100644 MyQianLiMa/Connected Services/ServiceReference1/Reference.svcmap create mode 100644 MyQianLiMa/Connected Services/ServiceReference1/blwws.disco create mode 100644 MyQianLiMa/Connected Services/ServiceReference1/blwws.wsdl create mode 100644 MyQianLiMa/Connected Services/ServiceReference1/configuration.svcinfo create mode 100644 MyQianLiMa/Connected Services/ServiceReference1/configuration91.svcinfo create mode 100644 MyQianLiMa/Controllers/ValuesController.cs create mode 100644 MyQianLiMa/Global.asax create mode 100644 MyQianLiMa/Global.asax.cs create mode 100644 MyQianLiMa/Index.aspx create mode 100644 MyQianLiMa/Index.aspx.cs create mode 100644 MyQianLiMa/Index.aspx.designer.cs create mode 100644 MyQianLiMa/Job/GetTokenJob.cs create mode 100644 MyQianLiMa/MyQianLiMa.csproj create mode 100644 MyQianLiMa/NLog.xsd create mode 100644 MyQianLiMa/PMS/ConfigData.cs create mode 100644 MyQianLiMa/PMS/QHotelData.cs create mode 100644 MyQianLiMa/PMS/QianLiMaReturnInfo.cs create mode 100644 MyQianLiMa/Properties/AssemblyInfo.cs create mode 100644 MyQianLiMa/Web.Debug.config create mode 100644 MyQianLiMa/Web.Release.config create mode 100644 MyQianLiMa/Web.config create mode 100644 MyQianLiMa/WebForm1.aspx create mode 100644 MyQianLiMa/WebForm1.aspx.cs create mode 100644 MyQianLiMa/WebForm1.aspx.designer.cs create mode 100644 MyQianLiMa/config.json create mode 100644 MyQianLiMa/nlog.config create mode 100644 MyQianLiMa/packages.config create mode 100644 PMSLogProduce/.config/dotnet-tools.json create mode 100644 PMSLogProduce/CSRedisCacheHelper.cs create mode 100644 PMSLogProduce/Controllers/WeatherForecastController.cs create mode 100644 PMSLogProduce/Models/Entity.cs create mode 100644 PMSLogProduce/PMSLogProduce.csproj create mode 100644 PMSLogProduce/PMSLogProduce.http create mode 100644 PMSLogProduce/Program.cs create mode 100644 PMSLogProduce/Properties/launchSettings.json create mode 100644 PMSLogProduce/Services/KafkaProduce.cs create mode 100644 PMSLogProduce/WeatherForecast.cs create mode 100644 PMSLogProduce/appsettings.Development.json create mode 100644 PMSLogProduce/appsettings.json create mode 100644 RestSharp/RestSharp.dll create mode 100644 RestSharp/RestSharp.xml create mode 100644 dll/AipSdk.dll create mode 100644 dll/aliyun-net-sdk-core.dll create mode 100644 dll/aliyun-net-sdk-dysmsapi.dll diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..1ff0c42 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,63 @@ +############################################################################### +# Set default behavior to automatically normalize line endings. +############################################################################### +* text=auto + +############################################################################### +# Set default behavior for command prompt diff. +# +# This is need for earlier builds of msysgit that does not have it on by +# default for csharp files. +# Note: This is only used by command line +############################################################################### +#*.cs diff=csharp + +############################################################################### +# Set the merge driver for project and solution files +# +# Merging from the command prompt will add diff markers to the files if there +# are conflicts (Merging from VS is not affected by the settings below, in VS +# the diff markers are never inserted). Diff markers may cause the following +# file extensions to fail to load in VS. An alternative would be to treat +# these files as binary and thus will always conflict and require user +# intervention with every merge. To do so, just uncomment the entries below +############################################################################### +#*.sln merge=binary +#*.csproj merge=binary +#*.vbproj merge=binary +#*.vcxproj merge=binary +#*.vcproj merge=binary +#*.dbproj merge=binary +#*.fsproj merge=binary +#*.lsproj merge=binary +#*.wixproj merge=binary +#*.modelproj merge=binary +#*.sqlproj merge=binary +#*.wwaproj merge=binary + +############################################################################### +# behavior for image files +# +# image files are treated as binary by default. +############################################################################### +#*.jpg binary +#*.png binary +#*.gif binary + +############################################################################### +# diff behavior for common document formats +# +# Convert binary document formats to text before diffing them. This feature +# is only available from the command line. Turn it on by uncommenting the +# entries below. +############################################################################### +#*.doc diff=astextplain +#*.DOC diff=astextplain +#*.docx diff=astextplain +#*.DOCX diff=astextplain +#*.dot diff=astextplain +#*.DOT diff=astextplain +#*.pdf diff=astextplain +#*.PDF diff=astextplain +#*.rtf diff=astextplain +#*.RTF diff=astextplain diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9491a2f --- /dev/null +++ b/.gitignore @@ -0,0 +1,363 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Oo]ut/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd \ No newline at end of file diff --git a/BLWWS/BLWWS.csproj b/BLWWS/BLWWS.csproj new file mode 100644 index 0000000..685e263 --- /dev/null +++ b/BLWWS/BLWWS.csproj @@ -0,0 +1,215 @@ + + + + + Debug + AnyCPU + + + 2.0 + {3D1C2418-8F29-4D2F-B7E9-BDBCD0FE021E} + {349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc} + Library + Properties + BLWWS + BLWWS + v4.0 + false + + + + + 4.0 + + + + + + + + + + true + full + false + bin\ + DEBUG;TRACE + prompt + 4 + false + + + pdbonly + true + bin\ + TRACE + prompt + 4 + false + + + + ..\packages\Common.Logging.3.3.1\lib\net40\Common.Logging.dll + + + ..\packages\Common.Logging.Core.3.3.1\lib\net40\Common.Logging.Core.dll + + + ..\packages\Microsoft.Bcl.AsyncInterfaces.8.0.0\lib\net462\Microsoft.Bcl.AsyncInterfaces.dll + + + + ..\packages\MySql.Data.6.7.9\lib\net40\MySql.Data.dll + + + ..\packages\Newtonsoft.Json.13.0.3\lib\net40\Newtonsoft.Json.dll + + + ..\packages\NLog.6.0.1\lib\net35\NLog.dll + + + ..\packages\Quartz.2.6.2\lib\net40\Quartz.dll + + + False + RestSharp\RestSharp.dll + + + ..\packages\sqlSugar.4.9.9.11\lib\SqlSugar.dll + + + + + + + + + + + + + + + + + + + + + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + MSDiscoCodeGenerator + Reference.cs + + + + Designer + + + Web.config + + + Web.config + + + + + blwws.asmx + Component + + + + Global.asax + + + + + + True + True + Settings.settings + + + syncstatus.asmx + Component + + + True + True + Reference.map + + + + + {CF2AB5DE-C3AF-4388-B6C4-EFA14BAF3316} + BLWWS_BLL + + + + + Designer + + + PreserveNewest + + + + + + + + + + + + + Dynamic + Web References\WebReference\ + http://47.119.147.104:9007/WebService1.asmx + + + + + Settings + BLWWS_WebReference_WebService1 + + + + 10.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + + + + + + False + True + 22346 + / + + + False + False + + + False + + + + + + \ No newline at end of file diff --git a/BLWWS/Common.cs b/BLWWS/Common.cs new file mode 100644 index 0000000..ee29d88 --- /dev/null +++ b/BLWWS/Common.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Security.Cryptography; +using System.Text; +using System.Web; + +namespace BLWWS +{ + public class Common + { + public static string MD5Encrypt(string str) + { + MD5CryptoServiceProvider md5Hasher = new MD5CryptoServiceProvider(); + byte[] hashedDataBytes; + hashedDataBytes = md5Hasher.ComputeHash(Encoding.UTF8.GetBytes(str)); + StringBuilder tmp = new StringBuilder(); + foreach (byte i in hashedDataBytes) + { + tmp.Append(i.ToString("x2")); + } + return tmp.ToString(); + } + public static long GetCurrentTimeStamp(DateTime dt) + { + TimeSpan ts = dt - new DateTime(1970, 1, 1, 8, 0, 0, DateTimeKind.Local); + long current_timestamp = Convert.ToInt64(ts.TotalSeconds); + return current_timestamp; + } + public static DateTime GetCurrentDateTime(long timestampseconds) + { + DateTime epoch = new DateTime(1970, 1, 1, 8, 0, 0, DateTimeKind.Local); + DateTime utcTime = epoch.AddSeconds(timestampseconds); + return utcTime; + } + } +} \ No newline at end of file diff --git a/BLWWS/Global.asax b/BLWWS/Global.asax new file mode 100644 index 0000000..9f55072 --- /dev/null +++ b/BLWWS/Global.asax @@ -0,0 +1 @@ +<%@ Application Codebehind="Global.asax.cs" Inherits="BLWWS.Global" Language="C#" %> diff --git a/BLWWS/Global.asax.cs b/BLWWS/Global.asax.cs new file mode 100644 index 0000000..0d204b7 --- /dev/null +++ b/BLWWS/Global.asax.cs @@ -0,0 +1,50 @@ +using System; +using System.Threading; +using System.Threading.Tasks; +using BLWWS_BLL; +using Quartz; +using Quartz.Impl; + +namespace BLWWS +{ + public class Global : System.Web.HttpApplication + { + + + protected void Application_Start(object sender, EventArgs e) + { + + } + + + + protected void Session_Start(object sender, EventArgs e) + { + + } + + protected void Application_BeginRequest(object sender, EventArgs e) + { + + } + + protected void Application_AuthenticateRequest(object sender, EventArgs e) + { + + } + + protected void Application_Error(object sender, EventArgs e) + { + + } + + protected void Session_End(object sender, EventArgs e) + { + + } + + protected void Application_End(object sender, EventArgs e) + { + } + } +} \ No newline at end of file diff --git a/BLWWS/HttpSendData.cs b/BLWWS/HttpSendData.cs new file mode 100644 index 0000000..ab970c9 --- /dev/null +++ b/BLWWS/HttpSendData.cs @@ -0,0 +1,89 @@ +using System; +using System.Collections.Generic; +using System.Configuration; +using System.Linq; +using System.Net; +using System.Web; +using Newtonsoft.Json; +using RestSharp; +namespace BLWWS +{ + public class HttpSendData + { + //public static readonly string BaseURL = "http://www.higmkj.com:8056"; + public static readonly string BaseURL = ConfigurationManager.AppSettings["BaoJing_BaseUrl"]; + private static readonly NLog.Logger _logger = NLog.LogManager.GetCurrentClassLogger(); + public static void SendData(PMSDataBase data) + { + //ssl 协议不兼容 + //var A = (SecurityProtocolType)48; + //var B = (SecurityProtocolType)192; + //var C = (SecurityProtocolType)768; + //var D = (SecurityProtocolType)3072; + //var E = (SecurityProtocolType)12288; + //ServicePointManager.SecurityProtocol = A | B | C | D | E; + var a = Newtonsoft.Json.JsonConvert.SerializeObject(data); + _logger.Error("宝镜推送CheckIn数据:" + a); + //var client1 = new RestClient(BaseURL); + //var request1 = new RestRequest("/order/checkIn", Method.POST); + //request1.AddJsonBody(data); + //var Response = client1.Execute(request1).Content; + //string content = Response; + WebReference.WebService1 w = new WebReference.WebService1(); + var Response = w.HelloWorld("C24cAfK", a, "/order/checkIn"); + _logger.Error("宝镜推送CheckIn结果:" + Response); + } + public static void SendData_CheckOut(PMSDataBase data) + { + + //ssl 协议不兼容 + //var A = (SecurityProtocolType)48; + //var B = (SecurityProtocolType)192; + //var C = (SecurityProtocolType)768; + //var D = (SecurityProtocolType)3072; + //var E = (SecurityProtocolType)12288; + //ServicePointManager.SecurityProtocol = A | B | C | D | E; + var a = Newtonsoft.Json.JsonConvert.SerializeObject(data); + _logger.Error("宝镜推送SendData_CheckOut数据:" + a); + //var client1 = new RestClient(BaseURL); + //var request1 = new RestRequest("/order/checkOut", Method.POST); + //request1.AddJsonBody(data); + //var Response = client1.Execute(request1).Content; + + WebReference.WebService1 w = new WebReference.WebService1(); + var Response = w.HelloWorld("C24cAfK", a, "/order/checkOut"); + _logger.Error("宝镜推送CheckOut:" + Response); + } + } + public class PMSDataBase + { + public string hotel_code { get; set; } = ""; + public string time { get; set; } = ""; + public string sign { get; set; } = ""; + public string hotel_id { get; set; } = ""; + public string order_no { get; set; } = ""; + public string room_no { get; set; } = ""; + public string check_out_original { get; set; } + } + + public class PMSData : PMSDataBase + { + public string checkIn { get; set; } + public string checkOut { get; set; } + public ushort is_breakfast { get; set; } + public ushort breakfast { get; set; } + public string rateCode { get; set; } + public string amount { get; set; } + public string order_original { get; set; } + public List infos { get; set; } + } + public class Info + { + public string name { get; set; } + public string mobile { get; set; } + public int type { get; set; } + public string idcard { get; set; } + public int sex { get; set; } + public string address { get; set; } + } +} \ No newline at end of file diff --git a/BLWWS/Id_G.cs b/BLWWS/Id_G.cs new file mode 100644 index 0000000..17e0d72 --- /dev/null +++ b/BLWWS/Id_G.cs @@ -0,0 +1,93 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Common +{ + public class IdWorker + { + //起始的时间戳 + private static long START_STMP = 1480166465631L; + + //每一部分占用的位数 + private static int SEQUENCE_BIT = 12; //序列号占用的位数 + private static int MACHINE_BIT = 5; //机器标识占用的位数 + private static int DATACENTER_BIT = 5;//数据中心占用的位数 + + //每一部分的最大值 + private static long MAX_DATACENTER_NUM = -1L ^ (-1L << DATACENTER_BIT); + private static long MAX_MACHINE_NUM = -1L ^ (-1L << MACHINE_BIT); + private static long MAX_SEQUENCE = -1L ^ (-1L << SEQUENCE_BIT); + + //每一部分向左的位移 + private static int MACHINE_LEFT = SEQUENCE_BIT; + private static int DATACENTER_LEFT = SEQUENCE_BIT + MACHINE_BIT; + private static int TIMESTMP_LEFT = DATACENTER_LEFT + DATACENTER_BIT; + + private long datacenterId = 1; //数据中心 + private long machineId = 1; //机器标识 + private long sequence = 0L; //序列号 + private long lastStmp = -1L;//上一次时间戳 + + #region 单例:完全懒汉 + private static readonly Lazy lazy = new Lazy(() => new IdWorker()); + public static IdWorker Singleton { get { return lazy.Value; } } + private IdWorker() { } + #endregion + + public IdWorker(long cid, long mid) + { + if (cid > MAX_DATACENTER_NUM || cid < 0) throw new Exception($"中心Id应在(0,{MAX_DATACENTER_NUM})之间"); + if (mid > MAX_MACHINE_NUM || mid < 0) throw new Exception($"机器Id应在(0,{MAX_MACHINE_NUM})之间"); + datacenterId = cid; + machineId = mid; + } + + /// + /// 产生下一个ID + /// + /// + public long nextId() + { + long currStmp = getNewstmp(); + if (currStmp < lastStmp) throw new Exception("时钟倒退,Id生成失败!"); + + if (currStmp == lastStmp) + { + //相同毫秒内,序列号自增 + sequence = (sequence + 1) & MAX_SEQUENCE; + //同一毫秒的序列数已经达到最大 + if (sequence == 0L) currStmp = getNextMill(); + } + else + { + //不同毫秒内,序列号置为0 + sequence = 0L; + } + + lastStmp = currStmp; + + return (currStmp - START_STMP) << TIMESTMP_LEFT //时间戳部分 + | datacenterId << DATACENTER_LEFT //数据中心部分 + | machineId << MACHINE_LEFT //机器标识部分 + | sequence; //序列号部分 + } + + private long getNextMill() + { + long mill = getNewstmp(); + while (mill <= lastStmp) + { + mill = getNewstmp(); + } + return mill; + } + + private long getNewstmp() + { + return (long)(DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds; + } + } +} diff --git a/BLWWS/Properties/AssemblyInfo.cs b/BLWWS/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..add2a49 --- /dev/null +++ b/BLWWS/Properties/AssemblyInfo.cs @@ -0,0 +1,35 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的常规信息通过以下特性集 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("BLWWS")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("BLWWS")] +[assembly: AssemblyCopyright("Copyright © 2015")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 会使此程序集中的类型 +// 对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型, +// 则将该类型上的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("eaa13017-f626-4924-9f79-79c079ff2100")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 内部版本号 +// 修订号 +// +// 您可以指定所有这些值,也可以使用“修订号”和“内部版本号”的默认值, +// 方法是按如下所示使用“*”: +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/BLWWS/Properties/Settings.Designer.cs b/BLWWS/Properties/Settings.Designer.cs new file mode 100644 index 0000000..e83c033 --- /dev/null +++ b/BLWWS/Properties/Settings.Designer.cs @@ -0,0 +1,36 @@ +//------------------------------------------------------------------------------ +// +// 此代码由工具生成。 +// 运行时版本:4.0.30319.42000 +// +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 +// +//------------------------------------------------------------------------------ + +namespace BLWWS.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.12.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + + [global::System.Configuration.ApplicationScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.SpecialSettingAttribute(global::System.Configuration.SpecialSetting.WebServiceUrl)] + [global::System.Configuration.DefaultSettingValueAttribute("http://47.119.147.104:9007/WebService1.asmx")] + public string BLWWS_WebReference_WebService1 { + get { + return ((string)(this["BLWWS_WebReference_WebService1"])); + } + } + } +} diff --git a/BLWWS/Properties/Settings.settings b/BLWWS/Properties/Settings.settings new file mode 100644 index 0000000..348bd0d --- /dev/null +++ b/BLWWS/Properties/Settings.settings @@ -0,0 +1,9 @@ + + + + + + http://47.119.147.104:9007/WebService1.asmx + + + \ No newline at end of file diff --git a/BLWWS/RestSharp/RestSharp.dll b/BLWWS/RestSharp/RestSharp.dll new file mode 100644 index 0000000000000000000000000000000000000000..1d40611c42388b154dd35810652400f70518e6ee GIT binary patch literal 163328 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 literal 0 HcmV?d00001 diff --git a/BLWWS/RestSharp/RestSharp.xml b/BLWWS/RestSharp/RestSharp.xml new file mode 100644 index 0000000..2d9254b --- /dev/null +++ b/BLWWS/RestSharp/RestSharp.xml @@ -0,0 +1,2897 @@ + + + + RestSharp + + + + + Default JSON serializer for request bodies + Doesn't currently use the SerializeAs attribute, defers to Newtonsoft's attributes + + + + + Default serializer + + + + + Serialize the object as JSON + + Object to serialize + JSON as String + + + + Unused for JSON Serialization + + + + + Unused for JSON Serialization + + + + + Unused for JSON Serialization + + + + + Content type for serialized content + + + + + Base class for common properties shared by RestResponse and RestResponse[[T]] + + + + + Default constructor + + + + + Assists with debugging responses by displaying in the debugger output + + + + + + The RestRequest that was made to get this RestResponse + + + Mainly for debugging if ResponseStatus is not OK + + + + + MIME content type of response + + + + + Length in bytes of the response content + + + + + Encoding of the response content + + + + + String representation of response content + + + + + HTTP response status code + + + + + Description of HTTP status returned + + + + + Response content + + + + + The URL that actually responded to the content (different from request if redirected) + + + + + HttpWebResponse.Server + + + + + Cookies returned by server with the response + + + + + Headers returned by server with the response + + + + + Status of the request. Will return Error for transport errors. + HTTP errors will still return ResponseStatus.Completed, check StatusCode instead + + + + + Transport or other non-HTTP error generated while attempting request + + + + + The exception thrown during the request, if any + + + + + The HTTP protocol version (1.0, 1.1, etc) + + Only set when underlying framework supports it. + + + + Container for data sent back from API including deserialized data + + Type of data to deserialize to + + + + Container for data sent back from API including deserialized data + + Type of data to deserialize to + + + + Container for data sent back from API + + + + + The RestRequest that was made to get this RestResponse + + + Mainly for debugging if ResponseStatus is not OK + + + + + MIME content type of response + + + + + Length in bytes of the response content + + + + + Encoding of the response content + + + + + String representation of response content + + + + + HTTP response status code + + + + + Description of HTTP status returned + + + + + Response content + + + + + The URL that actually responded to the content (different from request if redirected) + + + + + HttpWebResponse.Server + + + + + Cookies returned by server with the response + + + + + Headers returned by server with the response + + + + + Status of the request. Will return Error for transport errors. + HTTP errors will still return ResponseStatus.Completed, check StatusCode instead + + + + + Transport or other non-HTTP error generated while attempting request + + + + + Exceptions thrown during the request, if any. + + Will contain only network transport or framework exceptions thrown during the request. + HTTP protocol errors are handled by RestSharp and will not appear here. + + + + The HTTP protocol version (1.0, 1.1, etc) + + Only set when underlying framework supports it. + + + + Deserialized entity data + + + + + Deserialized entity data + + + + + Container for data sent back from API + + + + + Representation of an HTTP parameter (QueryString or Form value) + + + + + Name of the parameter + + + + + Value of the parameter + + + + + Content-Type of the parameter + + + + + HTTP response data + + + + + HTTP response data + + + + + MIME content type of response + + + + + Length in bytes of the response content + + + + + Encoding of the response content + + + + + String representation of response content + + + + + HTTP response status code + + + + + Description of HTTP status returned + + + + + Response content + + + + + The URL that actually responded to the content (different from request if redirected) + + + + + HttpWebResponse.Server + + + + + Headers returned by server with the response + + + + + Cookies returned by server with the response + + + + + Status of the request. Will return Error for transport errors. + HTTP errors will still return ResponseStatus.Completed, check StatusCode instead + + + + + Transport or other non-HTTP error generated while attempting request + + + + + Exception thrown when error is encountered. + + + + + The HTTP protocol version (1.0, 1.1, etc) + + Only set when underlying framework supports it. + + + + Default constructor + + + + + MIME content type of response + + + + + Length in bytes of the response content + + + + + Encoding of the response content + + + + + Lazy-loaded string representation of response content + + + + + HTTP response status code + + + + + Description of HTTP status returned + + + + + Response content + + + + + The URL that actually responded to the content (different from request if redirected) + + + + + HttpWebResponse.Server + + + + + Headers returned by server with the response + + + + + Cookies returned by server with the response + + + + + Status of the request. Will return Error for transport errors. + HTTP errors will still return ResponseStatus.Completed, check StatusCode instead + + + + + Transport or other non-HTTP error generated while attempting request + + + + + Exception thrown when error is encountered. + + + + + The HTTP protocol version (1.0, 1.1, etc) + + Only set when underlying framework supports it. + + + + Wrapper for System.Xml.Serialization.XmlSerializer. + + + + + Default constructor, does not specify namespace + + + + + Specify the namespaced to be used when serializing + + XML namespace + + + + Serialize the object as XML + + Object to serialize + XML as string + + + + Name of the root element to use when serializing + + + + + XML namespace to use when serializing + + + + + Format string to use when serializing dates + + + + + Content type for serialized content + + + + + Encoding for serialized content + + + + + Need to subclass StringWriter in order to override Encoding + + + + + Container for files to be uploaded with requests + + + + + Creates a file parameter from an array of bytes. + + The parameter name to use in the request. + The data to use as the file's contents. + The filename to use in the request. + The content type to use in the request. + The + + + + Creates a file parameter from an array of bytes. + + The parameter name to use in the request. + The data to use as the file's contents. + The filename to use in the request. + The using the default content type. + + + + The length of data to be sent + + + + + Provides raw data for file + + + + + Name of the file to use when uploading + + + + + MIME content type of file + + + + + Name of the parameter + + + + + XML Extension Methods + + + + + Returns the name of an element with the namespace if specified + + Element name + XML Namespace + + + + + + + + Helper methods for validating values + + + + + Validate an integer value is between the specified values (exclusive of min/max) + + Value to validate + Exclusive minimum value + Exclusive maximum value + + + + Validate a string length + + String to be validated + Maximum length of the string + + + + Container for data used to make requests + + + + + Adds a file to the Files collection to be included with a POST or PUT request + (other methods do not support file uploads). + + The parameter name to use in the request + Full path to file to upload + The MIME type of the file to upload + This request + + + + Adds the bytes to the Files collection with the specified file name and content type + + The parameter name to use in the request + The file data + The file name to use for the uploaded file + The MIME type of the file to upload + This request + + + + Adds the bytes to the Files collection with the specified file name and content type + + The parameter name to use in the request + A function that writes directly to the stream. Should NOT close the stream. + The file name to use for the uploaded file + The length (in bytes) of the file content. + The MIME type of the file to upload + This request + + + + Add bytes to the Files collection as if it was a file of specific type + + A form parameter name + The file data + The file name to use for the uploaded file + Specific content type. Es: application/x-gzip + + + + + Serializes obj to format specified by RequestFormat, but passes xmlNamespace if using the default XmlSerializer + The default format is XML. Change RequestFormat if you wish to use a different serialization format. + + The object to serialize + The XML namespace to use when serializing + This request + + + + Serializes obj to data format specified by RequestFormat and adds it to the request body. + The default format is XML. Change RequestFormat if you wish to use a different serialization format. + + The object to serialize + This request + + + + Serializes obj to JSON format and adds it to the request body. + + The object to serialize + This request + + + + Serializes obj to XML format and adds it to the request body. + + The object to serialize + This request + + + + Serializes obj to format specified by RequestFormat, but passes xmlNamespace if using the default XmlSerializer + Serializes obj to XML format and passes xmlNamespace then adds it to the request body. + + The object to serialize + The XML namespace to use when serializing + This request + + + + Calls AddParameter() for all public, readable properties specified in the includedProperties list + + + request.AddObject(product, "ProductId", "Price", ...); + + The object with properties to add as parameters + The names of the properties to include + This request + + + + Calls AddParameter() for all public, readable properties of obj + + The object with properties to add as parameters + This request + + + + Add the parameter to the request + + Parameter to add + + + + + Adds a HTTP parameter to the request (QueryString for GET, DELETE, OPTIONS and HEAD; Encoded form for POST and PUT) + + Name of the parameter + Value of the parameter + This request + + + + Adds a parameter to the request. There are five types of parameters: + - GetOrPost: Either a QueryString value or encoded form value based on method + - HttpHeader: Adds the name/value pair to the HTTP request's Headers collection + - UrlSegment: Inserted into URL if there is a matching url token e.g. {AccountId} + - Cookie: Adds the name/value pair to the HTTP request's Cookies collection + - RequestBody: Used by AddBody() (not recommended to use directly) + + Name of the parameter + Value of the parameter + The type of parameter to add + This request + + + + Adds a parameter to the request. There are five types of parameters: + - GetOrPost: Either a QueryString value or encoded form value based on method + - HttpHeader: Adds the name/value pair to the HTTP request's Headers collection + - UrlSegment: Inserted into URL if there is a matching url token e.g. {AccountId} + - Cookie: Adds the name/value pair to the HTTP request's Cookies collection + - RequestBody: Used by AddBody() (not recommended to use directly) + + Name of the parameter + Value of the parameter + Content-Type of the parameter + The type of parameter to add + This request + + + + Shortcut to AddParameter(name, value, HttpHeader) overload + + Name of the header to add + Value of the header to add + + + + + Shortcut to AddParameter(name, value, Cookie) overload + + Name of the cookie to add + Value of the cookie to add + + + + + Shortcut to AddParameter(name, value, UrlSegment) overload + + Name of the segment to add + Value of the segment to add + + + + + Shortcut to AddParameter(name, value, QueryString) overload + + Name of the parameter to add + Value of the parameter to add + + + + + Always send a multipart/form-data request - even when no Files are present. + + + + + Serializer to use when writing JSON request bodies. Used if RequestFormat is Json. + By default the included JsonSerializer is used (currently using JSON.NET default serialization). + + + + + Serializer to use when writing XML request bodies. Used if RequestFormat is Xml. + By default the included XmlSerializer is used. + + + + + Set this to write response to Stream rather than reading into memory. + + + + + Container of all HTTP parameters to be passed with the request. + See AddParameter() for explanation of the types of parameters that can be passed + + + + + Container of all the files to be uploaded with the request. + + + + + Determines what HTTP method to use for this request. Supported methods: GET, POST, PUT, DELETE, HEAD, OPTIONS + Default is GET + + + + + The Resource URL to make the request against. + Tokens are substituted with UrlSegment parameters and match by name. + Should not include the scheme or domain. Do not include leading slash. + Combined with RestClient.BaseUrl to assemble final URL: + {BaseUrl}/{Resource} (BaseUrl is scheme + domain, e.g. http://example.com) + + + // example for url token replacement + request.Resource = "Products/{ProductId}"; + request.AddParameter("ProductId", 123, ParameterType.UrlSegment); + + + + + Serializer to use when writing XML request bodies. Used if RequestFormat is Xml. + By default XmlSerializer is used. + + + + + Used by the default deserializers to determine where to start deserializing from. + Can be used to skip container or root elements that do not have corresponding deserialzation targets. + + + + + Used by the default deserializers to explicitly set which date format string to use when parsing dates. + + + + + Used by XmlDeserializer. If not specified, XmlDeserializer will flatten response by removing namespaces from element names. + + + + + In general you would not need to set this directly. Used by the NtlmAuthenticator. + + + + + Timeout in milliseconds to be used for the request. This timeout value overrides a timeout set on the RestClient. + + + + + The number of milliseconds before the writing or reading times out. This timeout value overrides a timeout set on the RestClient. + + + + + How many attempts were made to send this Request? + + + This Number is incremented each time the RestClient sends the request. + Useful when using Asynchronous Execution with Callbacks + + + + + Determine whether or not the "default credentials" (e.g. the user account under which the current process is running) + will be sent along to the server. The default is false. + + + + + Default constructor + + + + + Sets Method property to value of method + + Method to use for this request + + + + Sets Resource property + + Resource to use for this request + + + + Sets Resource and Method properties + + Resource to use for this request + Method to use for this request + + + + Sets Resource property + + Resource to use for this request + + + + Sets Resource and Method properties + + Resource to use for this request + Method to use for this request + + + + Adds a file to the Files collection to be included with a POST or PUT request + (other methods do not support file uploads). + + The parameter name to use in the request + Full path to file to upload + The MIME type of the file to upload + This request + + + + Adds the bytes to the Files collection with the specified file name + + The parameter name to use in the request + The file data + The file name to use for the uploaded file + The MIME type of the file to upload + This request + + + + Adds the bytes to the Files collection with the specified file name and content type + + The parameter name to use in the request + A function that writes directly to the stream. Should NOT close the stream. + The file name to use for the uploaded file + The length (in bytes) of the file content. + The MIME type of the file to upload + This request + + + + Add bytes to the Files collection as if it was a file of specific type + + A form parameter name + The file data + The file name to use for the uploaded file + Specific content type. Es: application/x-gzip + + + + + Serializes obj to format specified by RequestFormat, but passes xmlNamespace if using the default XmlSerializer + The default format is XML. Change RequestFormat if you wish to use a different serialization format. + + The object to serialize + The XML namespace to use when serializing + This request + + + + Serializes obj to data format specified by RequestFormat and adds it to the request body. + The default format is XML. Change RequestFormat if you wish to use a different serialization format. + + The object to serialize + This request + + + + Serializes obj to JSON format and adds it to the request body. + + The object to serialize + This request + + + + Serializes obj to XML format and adds it to the request body. + + The object to serialize + This request + + + + Serializes obj to format specified by RequestFormat, but passes xmlNamespace if using the default XmlSerializer + Serializes obj to XML format and passes xmlNamespace then adds it to the request body. + + The object to serialize + The XML namespace to use when serializing + This request + + + + Calls AddParameter() for all public, readable properties specified in the includedProperties list + + + request.AddObject(product, "ProductId", "Price", ...); + + The object with properties to add as parameters + The names of the properties to include + This request + + + + Calls AddParameter() for all public, readable properties of obj + + The object with properties to add as parameters + This request + + + + Add the parameter to the request + + Parameter to add + + + + + Adds a HTTP parameter to the request (QueryString for GET, DELETE, OPTIONS and HEAD; Encoded form for POST and PUT) + + Name of the parameter + Value of the parameter + This request + + + + Adds a parameter to the request. There are four types of parameters: + - GetOrPost: Either a QueryString value or encoded form value based on method + - HttpHeader: Adds the name/value pair to the HTTP request's Headers collection + - UrlSegment: Inserted into URL if there is a matching url token e.g. {AccountId} + - RequestBody: Used by AddBody() (not recommended to use directly) + + Name of the parameter + Value of the parameter + The type of parameter to add + This request + + + + Adds a parameter to the request. There are four types of parameters: + - GetOrPost: Either a QueryString value or encoded form value based on method + - HttpHeader: Adds the name/value pair to the HTTP request's Headers collection + - UrlSegment: Inserted into URL if there is a matching url token e.g. {AccountId} + - RequestBody: Used by AddBody() (not recommended to use directly) + + Name of the parameter + Value of the parameter + Content-Type of the parameter + The type of parameter to add + This request + + + + Shortcut to AddParameter(name, value, HttpHeader) overload + + Name of the header to add + Value of the header to add + + + + + Shortcut to AddParameter(name, value, Cookie) overload + + Name of the cookie to add + Value of the cookie to add + + + + + Shortcut to AddParameter(name, value, UrlSegment) overload + + Name of the segment to add + Value of the segment to add + + + + + Shortcut to AddParameter(name, value, UrlSegment) overload + + Name of the segment to add + Value of the segment to add + + + + + Shortcut to AddParameter(name, value, QueryString) overload + + Name of the parameter to add + Value of the parameter to add + + + + + Internal Method so that RestClient can increase the number of attempts + + + + + Always send a multipart/form-data request - even when no Files are present. + + + + + Serializer to use when writing JSON request bodies. Used if RequestFormat is Json. + By default the included JsonSerializer is used (currently using JSON.NET default serialization). + + + + + Serializer to use when writing XML request bodies. Used if RequestFormat is Xml. + By default the included XmlSerializer is used. + + + + + Set this to write response to Stream rather than reading into memory. + + + + + Determine whether or not the "default credentials" (e.g. the user account under which the current process is running) + will be sent along to the server. The default is false. + + + + + Container of all HTTP parameters to be passed with the request. + See AddParameter() for explanation of the types of parameters that can be passed + + + + + Container of all the files to be uploaded with the request. + + + + + Determines what HTTP method to use for this request. Supported methods: GET, POST, PUT, DELETE, HEAD, OPTIONS + Default is GET + + + + + The Resource URL to make the request against. + Tokens are substituted with UrlSegment parameters and match by name. + Should not include the scheme or domain. Do not include leading slash. + Combined with RestClient.BaseUrl to assemble final URL: + {BaseUrl}/{Resource} (BaseUrl is scheme + domain, e.g. http://example.com) + + + // example for url token replacement + request.Resource = "Products/{ProductId}"; + request.AddParameter("ProductId", 123, ParameterType.UrlSegment); + + + + + Determines how to serialize the request body. + By default Xml is used. + + + + + Used by the default deserializers to determine where to start deserializing from. + Can be used to skip container or root elements that do not have corresponding deserialzation targets. + + + + + A function to run prior to deserializing starting (e.g. change settings if error encountered) + + + + + Used by the default deserializers to explicitly set which date format string to use when parsing dates. + + + + + Used by XmlDeserializer. If not specified, XmlDeserializer will flatten response by removing namespaces from element names. + + + + + In general you would not need to set this directly. Used by the NtlmAuthenticator. + + + + + Gets or sets a user-defined state object that contains information about a request and which can be later + retrieved when the request completes. + + + + + Timeout in milliseconds to be used for the request. This timeout value overrides a timeout set on the RestClient. + + + + + The number of milliseconds before the writing or reading times out. This timeout value overrides a timeout set on the RestClient. + + + + + How many attempts were made to send this Request? + + + This Number is incremented each time the RestClient sends the request. + Useful when using Asynchronous Execution with Callbacks + + + + + Always send a multipart/form-data request - even when no Files are present. + + + + + An alternative to RequestBody, for when the caller already has the byte array. + + + + + Container for HTTP file + + + + + The length of data to be sent + + + + + Provides raw data for file + + + + + Name of the file to use when uploading + + + + + MIME content type of file + + + + + Name of the parameter + + + + + Representation of an HTTP cookie + + + + + Comment of the cookie + + + + + Comment of the cookie + + + + + Indicates whether the cookie should be discarded at the end of the session + + + + + Domain of the cookie + + + + + Indicates whether the cookie is expired + + + + + Date and time that the cookie expires + + + + + Indicates that this cookie should only be accessed by the server + + + + + Name of the cookie + + + + + Path of the cookie + + + + + Port of the cookie + + + + + Indicates that the cookie should only be sent over secure channels + + + + + Date and time the cookie was created + + + + + Value of the cookie + + + + + Version of the cookie + + + + + Client to translate RestRequests into Http requests and process response result + + + + + Executes a GET-style request and callback asynchronously, authenticating if needed + + Request to be executed + Callback function to be executed upon completion providing access to the async handle. + The HTTP method to execute + + + + Executes a POST-style request and callback asynchronously, authenticating if needed + + Request to be executed + Callback function to be executed upon completion providing access to the async handle. + The HTTP method to execute + + + + Executes a GET-style request and callback asynchronously, authenticating if needed + + Target deserialization type + Request to be executed + Callback function to be executed upon completion + The HTTP method to execute + + + + Executes a GET-style request and callback asynchronously, authenticating if needed + + Target deserialization type + Request to be executed + Callback function to be executed upon completion + The HTTP method to execute + + + + X509CertificateCollection to be sent with request + + + + + Default constructor that registers default content handlers + + + + + Sets the BaseUrl property for requests made by this client instance + + + + + + Sets the BaseUrl property for requests made by this client instance + + + + + + Registers a content handler to process response content + + MIME content type of the response content + Deserializer to use to process content + + + + Remove a content handler for the specified MIME content type + + MIME content type to remove + + + + Remove all content handlers + + + + + Retrieve the handler for the specified MIME content type + + MIME content type to retrieve + IDeserializer instance + + + + Assembles URL to call based on parameters, method and resource + + RestRequest to execute + Assembled System.Uri + + + + Executes the specified request and downloads the response data + + Request to execute + Response data + + + + Executes the request and returns a response, authenticating if needed + + Request to be executed + RestResponse + + + + Executes the specified request and deserializes the response content using the appropriate content handler + + Target deserialization type + Request to execute + RestResponse[[T]] with deserialized data in Data property + + + + Executes the request and callback asynchronously, authenticating if needed + + Request to be executed + Callback function to be executed upon completion providing access to the async handle. + + + + Executes a GET-style request and callback asynchronously, authenticating if needed + + Request to be executed + Callback function to be executed upon completion providing access to the async handle. + The HTTP method to execute + + + + Executes a POST-style request and callback asynchronously, authenticating if needed + + Request to be executed + Callback function to be executed upon completion providing access to the async handle. + The HTTP method to execute + + + + Executes the request and callback asynchronously, authenticating if needed + + Target deserialization type + Request to be executed + Callback function to be executed upon completion + + + + Executes a GET-style request and callback asynchronously, authenticating if needed + + Target deserialization type + Request to be executed + Callback function to be executed upon completion + The HTTP method to execute + + + + Executes a POST-style request and callback asynchronously, authenticating if needed + + Target deserialization type + Request to be executed + Callback function to be executed upon completion + The HTTP method to execute + + + + Maximum number of redirects to follow if FollowRedirects is true + + + + + X509CertificateCollection to be sent with request + + + + + Proxy to use for requests made by this client instance. + Passed on to underlying WebRequest if set. + + + + + The cache policy to use for requests initiated by this client instance. + + + + + Default is true. Determine whether or not requests that result in + HTTP status codes of 3xx should follow returned redirect + + + + + The CookieContainer used for requests made by this client instance + + + + + UserAgent to use for requests made by this client instance + + + + + Timeout in milliseconds to use for requests made by this client instance + + + + + The number of milliseconds before the writing or reading times out. + + + + + Whether to invoke async callbacks using the SynchronizationContext.Current captured when invoked + + + + + Authenticator to use for requests made by this client instance + + + + + Combined with Request.Resource to construct URL for request + Should include scheme and domain without trailing slash. + + + client.BaseUrl = new Uri("http://example.com"); + + + + + Parameters included with every request made with this instance of RestClient + If specified in both client and request, the request wins + + + + + Parameter container for REST requests + + + + + Return a human-readable representation of this parameter + + String + + + + Name of the parameter + + + + + Value of the parameter + + + + + Type of the parameter + + + + + MIME content type of the parameter + + + + + Convert a to a instance. + + The response status. + + responseStatus + + + + Allows control how class and property names and values are deserialized by XmlAttributeDeserializer + + + + + The name to use for the serialized element + + + + + Sets if the property to Deserialize is an Attribute or Element (Default: false) + + + + + A class to encapsulate OAuth authentication flow. + + + + + + Generates a instance to pass to an + for the purpose of requesting an + unauthorized request token. + + The HTTP method for the intended request + + + + + + Generates a instance to pass to an + for the purpose of requesting an + unauthorized request token. + + The HTTP method for the intended request + Any existing, non-OAuth query parameters desired in the request + + + + + + Generates a instance to pass to an + for the purpose of exchanging a request token + for an access token authorized by the user at the Service Provider site. + + The HTTP method for the intended request + + + + + Generates a instance to pass to an + for the purpose of exchanging a request token + for an access token authorized by the user at the Service Provider site. + + The HTTP method for the intended request + + Any existing, non-OAuth query parameters desired in the request + + + + Generates a instance to pass to an + for the purpose of exchanging user credentials + for an access token authorized by the user at the Service Provider site. + + The HTTP method for the intended request + + Any existing, non-OAuth query parameters desired in the request + + + + + + + + + + + + + HttpWebRequest wrapper + + + HttpWebRequest wrapper (sync methods) + + + HttpWebRequest wrapper (async methods) + + + + + Creates an IHttp + + + + + + Default constructor + + + + + Execute a POST request + + + + + Execute a PUT request + + + + + Execute a GET request + + + + + Execute a HEAD request + + + + + Execute an OPTIONS request + + + + + Execute a DELETE request + + + + + Execute a PATCH request + + + + + Execute a MERGE request + + + + + Execute a GET-style request with the specified HTTP Method. + + The HTTP method to execute. + + + + + Execute a POST-style request with the specified HTTP Method. + + The HTTP method to execute. + + + + + Execute an async POST-style request with the specified HTTP Method. + + + The HTTP method to execute. + + + + + Execute an async GET-style request with the specified HTTP Method. + + + The HTTP method to execute. + + + + + True if this HTTP request has any HTTP parameters + + + + + True if this HTTP request has any HTTP cookies + + + + + True if a request body has been specified + + + + + True if files have been set to be uploaded + + + + + Always send a multipart/form-data request - even when no Files are present. + + + + + UserAgent to be sent with request + + + + + Timeout in milliseconds to be used for the request + + + + + The number of milliseconds before the writing or reading times out. + + + + + System.Net.ICredentials to be sent with request + + + + + The System.Net.CookieContainer to be used for the request + + + + + The method to use to write the response instead of reading into RawBytes + + + + + Collection of files to be sent with request + + + + + Whether or not HTTP 3xx response redirects should be automatically followed + + + + + Whether or not to use pipelined connections + + + + + X509CertificateCollection to be sent with request + + + + + Maximum number of automatic redirects to follow if FollowRedirects is true + + + + + Determine whether or not the "default credentials" (e.g. the user account under which the current process is running) + will be sent along to the server. + + + + + HTTP headers to be sent with request + + + + + HTTP parameters (QueryString or Form values) to be sent with request + + + + + HTTP cookies to be sent with request + + + + + Request body to be sent with request + + + + + Content type of the request body. + + + + + An alternative to RequestBody, for when the caller already has the byte array. + + + + + URL to call for this request + + + + + Flag to send authorisation header with the HttpWebRequest + + + + + Proxy info to be sent with request + + + + + Caching policy for requests created with this wrapper. + + + + + Representation of an HTTP header + + + + + Name of the header + + + + + Value of the header + + + + + Tries to Authenticate with the credentials of the currently logged in user, or impersonate a user + + + + + Authenticate with the credentials of the currently logged in user + + + + + Authenticate by impersonation + + + + + + + Authenticate by impersonation, using an existing ICredentials instance + + + + + + JSON WEB TOKEN (JWT) Authenticator class. + https://tools.ietf.org/html/draft-ietf-oauth-json-web-token + + + + + Reflection extensions + + + + + Retrieve an attribute from a member (property) + + Type of attribute to retrieve + Member to retrieve attribute from + + + + + Retrieve an attribute from a type + + Type of attribute to retrieve + Type to retrieve attribute from + + + + + Checks a type to see if it derives from a raw generic (e.g. List[[]]) + + + + + + + + Find a value from a System.Enum by trying several possible variants + of the string value of the enum. + + Type of enum + Value for which to search + The culture used to calculate the name variants + + + + + Executes the request and callback asynchronously, authenticating if needed + + The IRestClient this method extends + Request to be executed + Callback function to be executed upon completion + + + + Executes the request and callback asynchronously, authenticating if needed + + The IRestClient this method extends + Target deserialization type + Request to be executed + Callback function to be executed upon completion providing access to the async handle + + + + Add a parameter to use on every request made with this client instance + + The IRestClient instance + Parameter to add + + + + + Removes a parameter from the default parameters that are used on every request made with this client instance + + The IRestClient instance + The name of the parameter that needs to be removed + + + + + Adds a HTTP parameter (QueryString for GET, DELETE, OPTIONS and HEAD; Encoded form for POST and PUT) + Used on every request made by this client instance + + The IRestClient instance + Name of the parameter + Value of the parameter + This request + + + + Adds a parameter to the request. There are four types of parameters: + - GetOrPost: Either a QueryString value or encoded form value based on method + - HttpHeader: Adds the name/value pair to the HTTP request's Headers collection + - UrlSegment: Inserted into URL if there is a matching url token e.g. {AccountId} + - RequestBody: Used by AddBody() (not recommended to use directly) + + The IRestClient instance + Name of the parameter + Value of the parameter + The type of parameter to add + This request + + + + Shortcut to AddDefaultParameter(name, value, HttpHeader) overload + + The IRestClient instance + Name of the header to add + Value of the header to add + + + + + Shortcut to AddDefaultParameter(name, value, UrlSegment) overload + + The IRestClient instance + Name of the segment to add + Value of the segment to add + + + + + Extension method overload! + + + + + Save a byte array to a file + + Bytes to save + Full path to save file to + + + + Read a stream into a byte array + + Stream to read + byte[] + + + + Copies bytes from one stream to another + + The input stream. + The output stream. + + + + Converts a byte array to a string, using its byte order mark to convert it to the right encoding. + http://www.shrinkrays.net/code-snippets/csharp/an-extension-method-for-converting-a-byte-array-to-a-string.aspx + + An array of bytes to convert + The byte as a string. + + + + Helper methods for validating required values + + + + + Require a parameter to not be null + + Name of the parameter + Value of the parameter + + + + Default XML Serializer + + + + + Default constructor, does not specify namespace + + + + + Specify the namespaced to be used when serializing + + XML namespace + + + + Serialize the object as XML + + Object to serialize + XML as string + + + + Determines if a given object is numeric in any way + (can be integer, double, null, etc). + + + + + Name of the root element to use when serializing + + + + + XML namespace to use when serializing + + + + + Format string to use when serializing dates + + + + + Content type for serialized content + + + + + Comment of the cookie + + + + + Comment of the cookie + + + + + Indicates whether the cookie should be discarded at the end of the session + + + + + Domain of the cookie + + + + + Indicates whether the cookie is expired + + + + + Date and time that the cookie expires + + + + + Indicates that this cookie should only be accessed by the server + + + + + Name of the cookie + + + + + Path of the cookie + + + + + Port of the cookie + + + + + Indicates that the cookie should only be sent over secure channels + + + + + Date and time the cookie was created + + + + + Value of the cookie + + + + + Version of the cookie + + + + + Base class for OAuth 2 Authenticators. + + + Since there are many ways to authenticate in OAuth2, + this is used as a base class to differentiate between + other authenticators. + + Any other OAuth2 authenticators must derive from this + abstract class. + + + + + Access token to be used when authenticating. + + + + + Initializes a new instance of the class. + + + The access token. + + + + + Gets the access token. + + + + + The OAuth 2 authenticator using URI query parameter. + + + Based on http://tools.ietf.org/html/draft-ietf-oauth-v2-10#section-5.1.2 + + + + + Initializes a new instance of the class. + + + The access token. + + + + + The OAuth 2 authenticator using the authorization request header field. + + + Based on http://tools.ietf.org/html/draft-ietf-oauth-v2-10#section-5.1.1 + + + + + Stores the Authorization header value as "[tokenType] accessToken". used for performance. + + + + + Initializes a new instance of the class. + + + The access token. + + + + + Initializes a new instance of the class. + + + The access token. + + + The token type. + + + + + Represents the json array. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The capacity of the json array. + + + + The json representation of the array. + + The json representation of the array. + + + + Represents the json object. + + + + + The internal member dictionary. + + + + + Initializes a new instance of . + + + + + Initializes a new instance of . + + The implementation to use when comparing keys, or null to use the default for the type of the key. + + + + Adds the specified key. + + The key. + The value. + + + + Determines whether the specified key contains key. + + The key. + + true if the specified key contains key; otherwise, false. + + + + + Removes the specified key. + + The key. + + + + + Tries the get value. + + The key. + The value. + + + + + Adds the specified item. + + The item. + + + + Clears this instance. + + + + + Determines whether [contains] [the specified item]. + + The item. + + true if [contains] [the specified item]; otherwise, false. + + + + + Copies to. + + The array. + Index of the array. + + + + Removes the specified item. + + The item. + + + + + Gets the enumerator. + + + + + + Returns an enumerator that iterates through a collection. + + + An object that can be used to iterate through the collection. + + + + + Returns a json that represents the current . + + + A json that represents the current . + + + + + Gets the at the specified index. + + + + + + Gets the keys. + + The keys. + + + + Gets the values. + + The values. + + + + Gets or sets the with the specified key. + + + + + + Gets the count. + + The count. + + + + Gets a value indicating whether this instance is read only. + + + true if this instance is read only; otherwise, false. + + + + + This class encodes and decodes JSON strings. + Spec. details, see http://www.json.org/ + + JSON uses Arrays and Objects. These correspond here to the datatypes JsonArray(IList<object>) and JsonObject(IDictionary<string,object>). + All numbers are parsed to doubles. + + + + + Parses the string json into a value + + A JSON string. + An IList<object>, a IDictionary<string,object>, a double, a string, null, true, or false + + + + Try parsing the json string into a value. + + + A JSON string. + + + The object. + + + Returns true if successfull otherwise false. + + + + + Converts a IDictionary<string,object> / IList<object> object into a JSON string + + A IDictionary<string,object> / IList<object> + Serializer strategy to use + A JSON encoded string, or null if object 'json' is not serializable + + + + Determines if a given object is numeric in any way + (can be integer, double, null, etc). + + + + + Allows control how class and property names and values are serialized by XmlSerializer + Currently not supported with the JsonSerializer + When specified at the property level the class-level specification is overridden + + + + + Called by the attribute when NameStyle is speficied + + The string to transform + String + + + + The name to use for the serialized element + + + + + Sets the value to be serialized as an Attribute instead of an Element + + + + + The culture to use when serializing + + + + + Transforms the casing of the name based on the selected value. + + + + + The order to serialize the element. Default is int.MaxValue. + + + + + Options for transforming casing of element names + + + + + Decodes an HTML-encoded string and returns the decoded string. + + The HTML string to decode. + The decoded text. + + + + Decodes an HTML-encoded string and sends the resulting output to a TextWriter output stream. + + The HTML string to decode + The TextWriter output stream containing the decoded string. + + + + HTML-encodes a string and sends the resulting output to a TextWriter output stream. + + The string to encode. + The TextWriter output stream containing the encoded string. + + + + All text parameters are UTF-8 encoded (per section 5.1). + + + + + + Generates a random 16-byte lowercase alphanumeric string. + + + + + + + Generates a timestamp based on the current elapsed seconds since '01/01/1970 0000 GMT" + + + + + + + Generates a timestamp based on the elapsed seconds of a given time since '01/01/1970 0000 GMT" + + + A specified point in time. + + + + + The set of characters that are unreserved in RFC 2396 but are NOT unreserved in RFC 3986. + + + + + + URL encodes a string based on section 5.1 of the OAuth spec. + Namely, percent encoding with [RFC3986], avoiding unreserved characters, + upper-casing hexadecimal characters, and UTF-8 encoding for text value pairs. + + The value to escape. + The escaped value. + + The method is supposed to take on + RFC 3986 behavior if certain elements are present in a .config file. Even if this + actually worked (which in my experiments it doesn't), we can't rely on every + host actually having this configuration element present. + + + + + + + URL encodes a string based on section 5.1 of the OAuth spec. + Namely, percent encoding with [RFC3986], avoiding unreserved characters, + upper-casing hexadecimal characters, and UTF-8 encoding for text value pairs. + + + + + + + Sorts a collection of key-value pairs by name, and then value if equal, + concatenating them into a single string. This string should be encoded + prior to, or after normalization is run. + + + + + + + + Sorts a by name, and then value if equal. + + A collection of parameters to sort + A sorted parameter collection + + + + Creates a request URL suitable for making OAuth requests. + Resulting URLs must exclude port 80 or port 443 when accompanied by HTTP and HTTPS, respectively. + Resulting URLs must be lower case. + + + The original request URL + + + + + Creates a request elements concatentation value to send with a request. + This is also known as the signature base. + + + + The request's HTTP method type + The request URL + The request's parameters + A signature base string + + + + Creates a signature value given a signature base and the consumer secret. + This method is used when the token secret is currently unknown. + + + The hashing method + The signature base + The consumer key + + + + + Creates a signature value given a signature base and the consumer secret. + This method is used when the token secret is currently unknown. + + + The hashing method + The treatment to use on a signature value + The signature base + The consumer key + + + + + Creates a signature value given a signature base and the consumer secret and a known token secret. + + + The hashing method + The signature base + The consumer secret + The token secret + + + + + Creates a signature value given a signature base and the consumer secret and a known token secret. + + + The hashing method + The treatment to use on a signature value + The signature base + The consumer secret + The token secret + + + + + Types of parameters that can be added to requests + + + + + Data formats + + + + + HTTP method to use when making requests + + + + + Format strings for commonly-used date formats + + + + + .NET format string for ISO 8601 date format + + + + + .NET format string for roundtrip date format + + + + + Status for responses (surprised?) + + + + + Wrapper for System.Xml.Serialization.XmlSerializer. + + + + + Uses Uri.EscapeDataString() based on recommendations on MSDN + http://blogs.msdn.com/b/yangxind/archive/2006/11/09/don-t-use-net-system-uri-unescapedatastring-in-url-decoding.aspx + + + + + Check that a string is not null or empty + + String to check + bool + + + + Remove underscores from a string + + String to process + string + + + + Parses most common JSON date formats + + JSON value to parse + + DateTime + + + + Remove leading and trailing " from a string + + String to parse + String + + + + Checks a string to see if it matches a regex + + String to check + Pattern to match + bool + + + + Converts a string to pascal case + + String to convert + + string + + + + Converts a string to pascal case with the option to remove underscores + + String to convert + Option to remove underscores + + + + + + Converts a string to camel case + + String to convert + + String + + + + Convert the first letter of a string to lower case + + String to convert + string + + + + Checks to see if a string is all uppper case + + String to check + bool + + + + Add underscores to a pascal-cased string + + String to convert + string + + + + Add dashes to a pascal-cased string + + String to convert + string + + + + Add an undescore prefix to a pascasl-cased string + + + + + + + Add spaces to a pascal-cased string + + String to convert + string + + + + Return possible variants of a name for name matching. + + String to convert + The culture to use for conversion + IEnumerable<string> + + + diff --git a/BLWWS/Web References/WebReference/Reference.cs b/BLWWS/Web References/WebReference/Reference.cs new file mode 100644 index 0000000..ae7702e --- /dev/null +++ b/BLWWS/Web References/WebReference/Reference.cs @@ -0,0 +1,154 @@ +//------------------------------------------------------------------------------ +// +// 此代码由工具生成。 +// 运行时版本:4.0.30319.42000 +// +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 +// +//------------------------------------------------------------------------------ + +// +// 此源代码是由 Microsoft.VSDesigner 4.0.30319.42000 版自动生成。 +// +#pragma warning disable 1591 + +namespace BLWWS.WebReference { + using System.Diagnostics; + using System; + using System.Xml.Serialization; + using System.ComponentModel; + using System.Web.Services.Protocols; + using System.Web.Services; + + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.8.9037.0")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Web.Services.WebServiceBindingAttribute(Name="WebService1Soap", Namespace="http://tempuri.org/")] + public partial class WebService1 : System.Web.Services.Protocols.SoapHttpClientProtocol { + + private System.Threading.SendOrPostCallback HelloWorldOperationCompleted; + + private bool useDefaultCredentialsSetExplicitly; + + /// + public WebService1() { + this.Url = global::BLWWS.Properties.Settings.Default.BLWWS_WebReference_WebService1; + if ((this.IsLocalFileSystemWebService(this.Url) == true)) { + this.UseDefaultCredentials = true; + this.useDefaultCredentialsSetExplicitly = false; + } + else { + this.useDefaultCredentialsSetExplicitly = true; + } + } + + public new string Url { + get { + return base.Url; + } + set { + if ((((this.IsLocalFileSystemWebService(base.Url) == true) + && (this.useDefaultCredentialsSetExplicitly == false)) + && (this.IsLocalFileSystemWebService(value) == false))) { + base.UseDefaultCredentials = false; + } + base.Url = value; + } + } + + public new bool UseDefaultCredentials { + get { + return base.UseDefaultCredentials; + } + set { + base.UseDefaultCredentials = value; + this.useDefaultCredentialsSetExplicitly = true; + } + } + + /// + public event HelloWorldCompletedEventHandler HelloWorldCompleted; + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/HelloWorld", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public string HelloWorld(string key, string data, string url) { + object[] results = this.Invoke("HelloWorld", new object[] { + key, + data, + url}); + return ((string)(results[0])); + } + + /// + public void HelloWorldAsync(string key, string data, string url) { + this.HelloWorldAsync(key, data, url, null); + } + + /// + public void HelloWorldAsync(string key, string data, string url, object userState) { + if ((this.HelloWorldOperationCompleted == null)) { + this.HelloWorldOperationCompleted = new System.Threading.SendOrPostCallback(this.OnHelloWorldOperationCompleted); + } + this.InvokeAsync("HelloWorld", new object[] { + key, + data, + url}, this.HelloWorldOperationCompleted, userState); + } + + private void OnHelloWorldOperationCompleted(object arg) { + if ((this.HelloWorldCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.HelloWorldCompleted(this, new HelloWorldCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + public new void CancelAsync(object userState) { + base.CancelAsync(userState); + } + + private bool IsLocalFileSystemWebService(string url) { + if (((url == null) + || (url == string.Empty))) { + return false; + } + System.Uri wsUri = new System.Uri(url); + if (((wsUri.Port >= 1024) + && (string.Compare(wsUri.Host, "localHost", System.StringComparison.OrdinalIgnoreCase) == 0))) { + return true; + } + return false; + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.8.9037.0")] + public delegate void HelloWorldCompletedEventHandler(object sender, HelloWorldCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.8.9037.0")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class HelloWorldCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal HelloWorldCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public string Result { + get { + this.RaiseExceptionIfNecessary(); + return ((string)(this.results[0])); + } + } + } +} + +#pragma warning restore 1591 \ No newline at end of file diff --git a/BLWWS/Web References/WebReference/Reference.map b/BLWWS/Web References/WebReference/Reference.map new file mode 100644 index 0000000..cde7ebf --- /dev/null +++ b/BLWWS/Web References/WebReference/Reference.map @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/BLWWS/Web References/WebReference/WebService1.disco b/BLWWS/Web References/WebReference/WebService1.disco new file mode 100644 index 0000000..96e01ea --- /dev/null +++ b/BLWWS/Web References/WebReference/WebService1.disco @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/BLWWS/Web References/WebReference/WebService1.wsdl b/BLWWS/Web References/WebReference/WebService1.wsdl new file mode 100644 index 0000000..69d8c16 --- /dev/null +++ b/BLWWS/Web References/WebReference/WebService1.wsdl @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/BLWWS/Web.config b/BLWWS/Web.config new file mode 100644 index 0000000..457751c --- /dev/null +++ b/BLWWS/Web.config @@ -0,0 +1,54 @@ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + http://47.119.147.104:9007/WebService1.asmx + + + + \ No newline at end of file diff --git a/BLWWS/blwws.asmx b/BLWWS/blwws.asmx new file mode 100644 index 0000000..81adffe --- /dev/null +++ b/BLWWS/blwws.asmx @@ -0,0 +1 @@ +<%@ WebService Language="C#" CodeBehind="blwws.asmx.cs" Class="BLWWS.blwws" %> diff --git a/BLWWS/blwws.asmx.cs b/BLWWS/blwws.asmx.cs new file mode 100644 index 0000000..ea55d28 --- /dev/null +++ b/BLWWS/blwws.asmx.cs @@ -0,0 +1,1282 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; +using System.Web.Services; +using System.Data; +using System.Timers; +using System.Xml; +using BLWWS_BLL; +using System.Data.SqlTypes; +using System.Text; +using System.Xml.Linq; +using Newtonsoft.Json; +using System.Net.NetworkInformation; +using System.Text.RegularExpressions; +using System.ServiceModel.Channels; +using System.Configuration; +using Common; +using Quartz; +using System.Threading.Tasks; +using Common.Logging; +using System.Net; +using RestSharp; +using BLWWS_BLL.Common; + +namespace BLWWS +{ + /// + /// blwws 的摘要说明 + /// + [WebService(Namespace = "http://www.blw.com/")] + [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] + [System.ComponentModel.ToolboxItem(false)] + // 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。 + // [System.Web.Script.Services.ScriptService] + public class blwws : System.Web.Services.WebService + { + public static string GetClientIP(HttpRequest Request) + { + string IP = ""; + string PPP = Request.UserHostAddress; + string III = Request.ServerVariables["REMOTE_ADDR"]; + if (string.IsNullOrEmpty(III)) + { + IP = PPP; + } + else + { + IP = III; + } + return IP; + } + /// + /// 验证码 + /// + private static readonly string _key = System.Configuration.ConfigurationManager.AppSettings["key"]; + private static int pmsid = 0; + [WebMethod(Description = "开房
key:验证码(我方提供),code:编码(我方提供),roomNumber:房号,checkInDate:入住日期,xmlString:客人信息,errorMsg:返回错误信息,phoneNumber:手机号码(多个以英文逗号,隔开),idNumber:身份证号(多个以英文逗号,隔开):获取微信登录验证码")] + //没有人脸机的接口 + public bool CheckIn(string key, string code, string roomNumber, DateTime checkInDate, string xmlString, ref string errorMsg, string phoneNumber = "", string idNumber = "") + { + CheckInYuanShidata data1 = new CheckInYuanShidata(); + data1.CommandType = "CheckIn"; + string msgid = Guid.NewGuid().ToString("N"); + + string IP = GetClientIP(HttpContext.Current.Request); + GlobalCache.Init(); + string order_original = ""; + ExtraData EEE = null; + try + { + var cookie = HttpContext.Current.Request.Cookies["cookiedomain"]; + if (cookie != null) + { + order_original = HttpUtility.UrlDecode(cookie.Value); + EEE = Newtonsoft.Json.JsonConvert.DeserializeObject(order_original); + order_original = EEE.OriginalData; + } + } + catch (Exception ex) + { + _logger.Error("Cookie 出错"); + } + + if (EEE != null) + { + IP = EEE.RequestIP; + data1.JianJieData = new JianJie() { OriginallData = EEE.OriginalData }; + } + else + { + data1.ZhiJieData = new ZhiJie() + { + CheckInData = new CheckInData() + { + key = key, + checkInDate = checkInDate, + code = code, + idNumber = idNumber, + phoneNumber = phoneNumber, + roomNumber = roomNumber, + xmlString = xmlString + } + }; + } + data1.IP = IP; + data1.Step = 1; + data1.RequestId = msgid; + data1.CurrentTime = DateTime.Now; + + var vvv = JsonConvert.SerializeObject(data1); + CSRedisCacheHelper.Publish(StaticData.PMSLogMonitor, vvv); + + + int YesNoFace = 1; + if (_key != key) + { + errorMsg = "验证码key(" + key + ")有误"; + return false; + } + if (string.IsNullOrEmpty(code)) + { + errorMsg = "编码不能为空"; + return false; + } + if (string.IsNullOrEmpty(roomNumber)) + { + errorMsg = "房号不能为空"; + return false; + } + if (string.IsNullOrEmpty(xmlString)) + { + errorMsg = "客人信息不能为空"; + return false; + } + try + { + var T = BLL.GetHotelCode(code); + + string hotelid = ""; + string Is_Push_BaoJing = ""; + if (T.Rows.Count == 0) + { + errorMsg = "编码code(" + code + ")有误"; + return false; + } + else + { + string HotelID = T.Rows[0]["HotelID"].ToString(); + Is_Push_BaoJing = T.Rows[0]["Is_Push_BaoJing"].ToString(); + hotelid = HotelID; + } + + long checkInID = 0; + if (BLL.CheckIn(code, roomNumber, checkInDate, xmlString, YesNoFace, key, ref checkInID, phoneNumber, idNumber, msgid) > 0) + { + if (Is_Push_BaoJing.Equals("1")) + { + ConstructPushData(code, roomNumber, checkInDate, xmlString, phoneNumber, idNumber, hotelid, order_original); + + CheckInYuanShidata data2 = new CheckInYuanShidata(); + data2.RequestId = msgid; + data2.Step = 4; + data2.CurrentTime = DateTime.Now; + } + LogHelper.WriteLog("开房成功:" + code + "-" + roomNumber); + + CheckInYuanShidata data3 = new CheckInYuanShidata(); + data3.RequestId = msgid; + data3.Step = 5; + data3.CurrentTime = DateTime.Now; + data3.ReturnMsg = "开房成功"; + + + var vvv1 = JsonConvert.SerializeObject(data1); + CSRedisCacheHelper.Publish(StaticData.PMSLogMonitor, vvv1); + return true; + } + else + { + errorMsg = "开房失败"; + + CheckInYuanShidata data3 = new CheckInYuanShidata(); + data3.RequestId = msgid; + data3.Step = 5; + data3.CurrentTime = DateTime.Now; + data3.ReturnMsg = "开房失败"; + + + var vvv1 = JsonConvert.SerializeObject(data1); + CSRedisCacheHelper.Publish(StaticData.PMSLogMonitor, vvv1); + return false; + } + } + catch (Exception ex) + { + errorMsg = ex.Message; + LogHelper.WriteLog(code + "-" + ex.ToString()); + } + return false; + } + + [WebMethod(Description = "开房
key:验证码(我方提供),code:编码(我方提供),roomNumber:房号,checkInDate:入住日期,xmlString:客人信息,errorMsg:返回错误信息,checkInID:返回入住记录ID,phoneNumber:手机号码(多个以英文逗号,隔开),idNumber:身份证号(多个以英文逗号,隔开):获取微信登录验证码")] + //有人脸机的接口 + public bool CheckIn2(string key, string code, string roomNumber, DateTime checkInDate, string xmlString, ref string errorMsg, ref long checkInID, string phoneNumber = "", string idNumber = "") + { + + CheckInYuanShidata data1 = new CheckInYuanShidata(); + data1.CommandType = "CheckIn2"; + string msgid = Guid.NewGuid().ToString("N"); + string IP = GetClientIP(HttpContext.Current.Request); + + ExtraData EEE = null; + string order_original = ""; + try + { + var cookie = HttpContext.Current.Request.Cookies["cookiedomain"]; + if (cookie != null) + { + order_original = HttpUtility.UrlDecode(cookie.Value); + EEE = Newtonsoft.Json.JsonConvert.DeserializeObject(order_original); + order_original = EEE.OriginalData; + IP = EEE.RequestIP; + data1.JianJieData = new JianJie() { OriginallData = order_original }; + } + } + catch (Exception ex) + { + _logger.Error("Cookie 出错" + ex.Message); + } + if (EEE == null) + { + data1.ZhiJieData = new ZhiJie() + { + CheckInData = new CheckInData() + { + key = key, + checkInDate = checkInDate, + code = code, + idNumber = idNumber, + phoneNumber = phoneNumber, + roomNumber = roomNumber, + xmlString = xmlString + } + }; + } + + data1.Step = 1; + data1.RequestId = msgid; + data1.CurrentTime = DateTime.Now; + data1.IP = IP; + var vvv = JsonConvert.SerializeObject(data1); + CSRedisCacheHelper.Publish(StaticData.PMSLogMonitor, vvv); + + PmsInterface info = new PmsInterface() + { + pmstype = 1, + DateTime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")), + pmsContent = xmlString, + hotelid = -1, + }; + pmsid = SqlSugarBase.GesmartDb().Insertable(info).ExecuteReturnIdentity(); + List pmsinfo = new List(); + pmsLog pmslog = new pmsLog + { + pmsid = pmsid, + app = 1, + step = 103, + Data = xmlString, + Creationtime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")), + message = "收到上传人pms信息", + + }; + pmsinfo.Add(pmslog); + int YesNoFace = 0; + if (_key != key) + { + errorMsg = "验证码key(" + key + ")有误"; + pmsLog pmsn = new pmsLog + { + pmsid = pmsid, + app = 1, + step = 110, + Data = "false" + errorMsg + "=验证码key(" + key + ")有误", + Creationtime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")), + message = "开房接口pms回复信息", + }; + pmsinfo.Add(pmsn); + SqlSugarBase.GesmartDb().Insertable(pmsinfo).ExecuteCommand(); + return false; + } + if (string.IsNullOrEmpty(code)) + { + errorMsg = "编码不能为空"; + pmsLog pmsn = new pmsLog + { + pmsid = pmsid, + app = 1, + step = 111, + Data = "false" + errorMsg + "=编码不能为空", + Creationtime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")), + message = "开房接口pms回复信息", + }; + pmsinfo.Add(pmsn); + SqlSugarBase.GesmartDb().Insertable(pmsinfo).ExecuteCommand(); + return false; + } + if (string.IsNullOrEmpty(roomNumber)) + { + errorMsg = "房号不能为空"; + pmsLog pmsn = new pmsLog + { + pmsid = pmsid, + app = 1, + step = 112, + Data = "false" + errorMsg + "=房号不能为空", + Creationtime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")), + message = "开房接口pms回复信息", + }; + pmsinfo.Add(pmsn); + SqlSugarBase.GesmartDb().Insertable(pmsinfo).ExecuteCommand(); + return false; + } + if (string.IsNullOrEmpty(xmlString)) + { + errorMsg = "客人信息不能为空"; + pmsLog pmsn = new pmsLog + { + pmsid = pmsid, + app = 1, + step = 113, + Data = "false" + errorMsg + "=客人信息不能为空", + Creationtime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")), + message = "开房接口pms回复信息", + }; + pmsinfo.Add(pmsn); + SqlSugarBase.GesmartDb().Insertable(pmsinfo).ExecuteCommand(); + return false; + } + try + { + + + var T = BLL.GetHotelCode(code); + + string hotelid = ""; + string Is_Push_BaoJing = ""; + if (T.Rows.Count == 0) + { + errorMsg = "编码code(" + code + ")有误"; + return false; + } + else + { + string HotelID = T.Rows[0]["HotelID"].ToString(); + Is_Push_BaoJing = T.Rows[0]["Is_Push_BaoJing"].ToString(); + hotelid = HotelID; + } + //if (BLL.GetHotelCode(code).Rows.Count == 0) + //{ + // errorMsg = "编码code(" + code + ")有误"; + // return false; + //} + if (BLL.CheckIn(code, roomNumber, checkInDate, xmlString, YesNoFace, key, ref checkInID, phoneNumber, idNumber, msgid) > 0) + { + //LogHelper.WriteLog("有人脸机的接口回复信息:true,开房成功:" + code + "-" + roomNumber); + pmsLog pmsn = new pmsLog + { + pmsid = pmsid, + app = 1, + step = 116, + Data = "true", + Creationtime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")), + message = "开房接口pms回复信息", + }; + pmsinfo.Add(pmsn); + SqlSugarBase.GesmartDb().Insertable(pmsinfo).ExecuteCommand(); + + if (Is_Push_BaoJing.Equals("1")) + { + ConstructPushData(code, roomNumber, checkInDate, xmlString, phoneNumber, idNumber, hotelid, order_original); + } + + CheckInYuanShidata data3 = new CheckInYuanShidata(); + data3.RequestId = msgid; + data3.Step = 5; + data3.CurrentTime = DateTime.Now; + data3.ReturnMsg = "开房成功"; + + + var vvv1 = JsonConvert.SerializeObject(data1); + CSRedisCacheHelper.Publish(StaticData.PMSLogMonitor, vvv1); + return true; + } + else + { + //LogHelper.WriteLog("有人脸机的接口回复信息:false,errorMsg = 开房失败"); + pmsLog pmsn = new pmsLog + { + pmsid = pmsid, + app = 1, + step = 120, + Data = "false" + errorMsg + "=开房失败", + Creationtime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")), + message = "开房接口pms回复信息", + }; + pmsinfo.Add(pmsn); + SqlSugarBase.GesmartDb().Insertable(pmsinfo).ExecuteCommand(); + errorMsg = "开房失败"; + + + CheckInYuanShidata data3 = new CheckInYuanShidata(); + data3.RequestId = msgid; + data3.Step = 5; + data3.CurrentTime = DateTime.Now; + data3.ReturnMsg = errorMsg; + + + var vvv1 = JsonConvert.SerializeObject(data1); + CSRedisCacheHelper.Publish(StaticData.PMSLogMonitor, vvv1); + return false; + } + } + catch (Exception ex) + { + errorMsg = ex.Message; + LogHelper.WriteLog(code + "-" + ex.ToString()); + } + return false; + } + + [WebMethod(Description = "上传入住人信息
key:验证码(我方提供),code:编码(我方提供),checkInID:入住记录ID,idType:证件类型(0身份证,1护照,2军官证,3其他),idCard:证件号码,name:姓名,sex:性别(0女,1男,2其他),birthday:出生日期(1999-01-01),photoUrl:图片路径(与photo二选一),photo:图片(二进制),errorMsg:错误信息")] + public bool UploadPhoto(string key, string code, long checkInID, int idType, string idCard, string name, int sex, string birthday, string photoUrl, byte[] photo, ref string errorMsg) + { + + try + { + string photoData = string.Format("{0},{1},{2},{3},{4},{5},{6},{7},{8}", key, code, checkInID, idType, idCard, name, sex, birthday, photoUrl); + + LogHelper.WriteLog("UploadPhoto 传过的数据为:" + photoData); + + //if (photo.Length > 0) + //{ + // //string ImageByte = Tools.ByteToString(photo); + + // //LogHelper.WriteLog("UploadPhoto 传过的图片数据为:" + ImageByte); + //} + + #region 新添加的代码 + + string ip = ""; + List ts = new List(); + // 获取所有网络接口 + NetworkInterface[] interfaces = NetworkInterface.GetAllNetworkInterfaces(); + + // 遍历每个网络接口 + foreach (NetworkInterface networkInterface in interfaces) + { + // 获取IP地址 + IPInterfaceProperties ipProperties = networkInterface.GetIPProperties(); + UnicastIPAddressInformationCollection ipAddresses = ipProperties.UnicastAddresses; + + // 遍历每个IP地址 + foreach (UnicastIPAddressInformation ipAddress in ipAddresses) + { + // 判断是否为IPv4地址 + if (ipAddress.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) + { + //过滤本地ip + if (ipAddress.Address.ToString() != "127.0.0.1") + { + //局域网ip + ip = ipAddress.Address.ToString(); + } + + } + } + } + + + if (idCard.Contains("*") || string.IsNullOrEmpty(idCard)) + { + idCard = Tools.GetCurrentTimeStamp(DateTime.Now).ToString(); + //idCard = idworker.nextId().ToString(); + } + Uploadinfo uploadinfo = new Uploadinfo() + { + key = key, + code = code, + checkInID = checkInID, + idType = idType, + idCard = idCard, + name = name, + sex = sex, + birthday = birthday, + photoUrl = photoUrl, + //photo = "photo.Length_"+ photo.Length, + }; + string jsonString = JsonConvert.SerializeObject(uploadinfo); + + pmsLog pmslog = new pmsLog + { + pmsid = pmsid, + app = 1, + step = 101, + Data = jsonString, + Creationtime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")), + message = "pms服务收到信息", + Ip = ip + }; + ts.Add(pmslog); + //SqlSugarBase.GesmartDb().Insertable(pmslog).ExecuteCommand(); + #endregion + + + if (_key != key) + { + errorMsg = "验证码key(" + key + ")有误"; + pmsLog pmsn = new pmsLog + { + pmsid = pmsid, + app = 1, + step = 110, + Data = "false," + errorMsg + "=验证码key(" + key + ")有误", + Creationtime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")), + message = "上传入住人信息pms回复信息", + }; + ts.Add(pmsn); + SqlSugarBase.GesmartDb().Insertable(ts).ExecuteCommand(); + return false; + } + if (string.IsNullOrEmpty(code)) + { + errorMsg = "编码不能为空"; + pmsLog pmsn = new pmsLog + { + pmsid = pmsid, + app = 1, + step = 111, + Data = "false," + errorMsg + "=编码不能为空", + Creationtime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")), + message = "上传入住人信息pms回复信息", + }; + ts.Add(pmsn); + SqlSugarBase.GesmartDb().Insertable(ts).ExecuteCommand(); + return false; + } + string msg = ""; + if (BLL.UploadPhoto(idType, idCard, name, sex, birthday, photoUrl, photo, checkInID, pmsid, ref msg) > 0) + { + pmsLog pmsn = new pmsLog + { + pmsid = pmsid, + app = 1, + step = 116, + Data = "true", + Creationtime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")), + message = "上传入住人信息pms回复信息", + }; + ts.Add(pmsn); + SqlSugarBase.GesmartDb().Insertable(ts).ExecuteCommand(); + return true; + } + else + { + errorMsg = msg; + pmsLog pmsn = new pmsLog + { + pmsid = pmsid, + app = 1, + step = 114, + Data = "false,errorMsg=开房失败", + Creationtime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")), + message = "上传入住人信息pms回复信息" + msg, + }; + ts.Add(pmsn); + SqlSugarBase.GesmartDb().Insertable(ts).ExecuteCommand(); + return false; + } + } + catch (Exception ex) + { + errorMsg = ex.Message; + LogHelper.WriteLog(ex.ToString()); + return false; + } + + } + + [WebMethod(Description = "变更手机号
key:验证码(我方提供),code:编码(我方提供),roomNumber:房号,errorMsg:错误信息,phoneNumber:手机号码(多个以英文逗号,隔开),idNumber:身份证号:获取验证码")] + public bool ChangePhoneNumber(string key, string code, string roomNumber, string phoneNumber, string idNumber, ref string errorMsg) + { + if (_key != key) + { + errorMsg = "验证码key(" + key + ")有误"; + return false; + } + if (string.IsNullOrEmpty(code)) + { + errorMsg = "编码不能为空"; + return false; + } + if (string.IsNullOrEmpty(roomNumber)) + { + errorMsg = "房号不能为空"; + return false; + } + if (string.IsNullOrEmpty(phoneNumber)) + { + errorMsg = "手机号不能为空,多个以英文逗号,隔开"; + return false; + } + try + { + if (BLL.GetHotelCode(code).Rows.Count == 0) + { + errorMsg = "编码code(" + code + ")有误"; + return false; + } + if (BLL.ChangePhoneNumber(code, roomNumber, phoneNumber, idNumber) > 0) + { + LogHelper.WriteLog("变更手机号成功:" + code + "-" + roomNumber); + return true; + } + else + { + errorMsg = "变更手机号失败"; + return false; + } + } + catch (Exception ex) + { + errorMsg = ex.Message; + LogHelper.WriteLog(code + "-" + ex.ToString()); + } + return false; + } + + [WebMethod(Description = "退房
key:验证码(我方提供),code:编码(我方提供),roomNumber:房号,checkOutDate:退房日期,errorMsg:错误信息")] + public bool CheckOut(string key, string code, string roomNumber, DateTime checkOutDate, ref string errorMsg) + { + + CheckInYuanShidata data1 = new CheckInYuanShidata(); + data1.CommandType = "CheckOut"; + string msgid = Guid.NewGuid().ToString("N"); + string IP = GetClientIP(HttpContext.Current.Request); + + ExtraData EEE = null; + string order_original = ""; + try + { + var cookie = HttpContext.Current.Request.Cookies["cookiedomain"]; + if (cookie != null) + { + order_original = HttpUtility.UrlDecode(cookie.Value); + EEE = Newtonsoft.Json.JsonConvert.DeserializeObject(order_original); + order_original = EEE.OriginalData; + IP = EEE.RequestIP; + + data1.JianJieData = new JianJie() { OriginallData = order_original }; + } + } + catch (Exception ex) + { + LogHelper.WriteLog("cookie 出错"); + } + + if (EEE == null) + { + data1.ZhiJieData = new ZhiJie() + { + CheckOutData = new CheckOutData() + { + checkOutDate = checkOutDate, + code = code, + key = key, + roomNumber = roomNumber, + } + }; + } + + data1.IP = IP; + data1.Step = 1; + data1.RequestId = msgid; + var vvv = JsonConvert.SerializeObject(data1); + CSRedisCacheHelper.Publish(StaticData.PMSLogMonitor, vvv); + + StringBuilder sb = new StringBuilder(); + var rlinfo = new + { + keys = key, + codes = code, + roomNumbers = roomNumber, + checkOutDates = checkOutDate, + }; + + sb.Append(Newtonsoft.Json.JsonConvert.SerializeObject(rlinfo)); + PmsInterface info = new PmsInterface + { + pmstype = 0, + DateTime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")), + pmsContent = sb.ToString(), + hotelid = -1 + + }; + int pmsids = SqlSugarBase.GesmartDb().Insertable(info).ExecuteReturnIdentity(); + string ip = ""; + + // 获取所有网络接口 + NetworkInterface[] interfaces = NetworkInterface.GetAllNetworkInterfaces(); + + // 遍历每个网络接口 + foreach (NetworkInterface networkInterface in interfaces) + { + // 获取IP地址 + IPInterfaceProperties ipProperties = networkInterface.GetIPProperties(); + UnicastIPAddressInformationCollection ipAddresses = ipProperties.UnicastAddresses; + + // 遍历每个IP地址 + foreach (UnicastIPAddressInformation ipAddress in ipAddresses) + { + // 判断是否为IPv4地址 + if (ipAddress.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) + { + //过滤本地ip + if (ipAddress.Address.ToString() != "127.0.0.1") + { + //局域网ip + ip = ipAddress.Address.ToString(); + } + + } + } + } + pmsLog pmslog = new pmsLog + { + pmsid = pmsids, + app = 1, + step = 101, + Data = sb.ToString(), + Creationtime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")), + message = "pms服务收到信息", + Ip = ip + //HotelCode = dr["Code"].ToString(), + //roomid = dr["RoomNumber"].ToString() + }; + SqlSugarBase.GesmartDb().Insertable(pmslog).ExecuteCommand(); + + + + if (_key != key) + { + errorMsg = "验证码key(" + key + ")有误"; + + pmsLog pms = new pmsLog + { + pmsid = pmsids, + app = 1, + step = 130, + Data = "false," + errorMsg + "=验证码key(" + key + ")有误", + Creationtime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")), + message = "退房接口pms回复信息", + }; + + + SqlSugarBase.GesmartDb().Insertable(pms).ExecuteCommand(); + return false; + } + if (string.IsNullOrEmpty(code)) + { + errorMsg = "编码不能为空"; + pmsLog pms = new pmsLog + { + pmsid = pmsids, + app = 1, + step = 131, + Data = "false," + errorMsg + "=编码不能为空", + Creationtime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")), + message = "上传入住人信息pms回复信息", + }; + + SqlSugarBase.GesmartDb().Insertable(pms).ExecuteCommand(); + + return false; + } + if (string.IsNullOrEmpty(roomNumber)) + { + errorMsg = "房号不能为空"; + pmsLog pms = new pmsLog + { + pmsid = pmsids, + app = 1, + step = 132, + Data = "false," + errorMsg + "=房号不能为空", + Creationtime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")), + message = "退房接口pms回复信息", + }; + SqlSugarBase.GesmartDb().Insertable(pms).ExecuteCommand(); + return false; + } + try + { + + var T = BLL.GetHotelCode(code); + + string hotelid = ""; + + string Is_Push_BaoJing = ""; + if (T.Rows.Count == 0) + { + errorMsg = "编码code(" + code + ")有误"; + pmsLog pms = new pmsLog + { + pmsid = pmsids, + app = 1, + step = 133, + Data = "false," + errorMsg + "=编码code(" + code + ")有误", + Creationtime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")), + message = "退房接口pms回复信息", + }; + + SqlSugarBase.GesmartDb().Insertable(pms).ExecuteCommand(); + + return false; + } + else + { + string HotelID = T.Rows[0]["HotelID"].ToString(); + Is_Push_BaoJing = T.Rows[0]["Is_Push_BaoJing"].ToString(); + hotelid = HotelID; + } + if (BLL.CheckOut(code, roomNumber, checkOutDate, pmsids, msgid) > 0) + { + pmsLog pms = new pmsLog + { + pmsid = pmsids, + app = 1, + step = 136, + Data = "true", + Creationtime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")), + message = "退房接口pms回复信息", + }; + + + SqlSugarBase.GesmartDb().Insertable(pms).ExecuteCommand(); + LogHelper.WriteLog("退房成功:" + code + "-" + roomNumber); + + + if (Is_Push_BaoJing.Equals("1")) + { + PMSDataBase b = new PMSDataBase(); + b.hotel_code = code; + b.hotel_id = hotelid; + b.room_no = roomNumber; + b.order_no = System.Guid.NewGuid().ToString("N"); + b.check_out_original = order_original; + PMSDataPushBaoJing(b, 2); + } + + + CheckInYuanShidata data3 = new CheckInYuanShidata(); + data3.RequestId = msgid; + data3.Step = 5; + data3.CurrentTime = DateTime.Now; + data3.ReturnMsg = "退房成功"; + + + var vvv1 = JsonConvert.SerializeObject(data1); + CSRedisCacheHelper.Publish(StaticData.PMSLogMonitor, vvv1); + return true; + } + else + { + pmsLog pms = new pmsLog + { + pmsid = pmsids, + app = 1, + step = 134, + Data = "false,errorMsg=退房失败", + Creationtime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")), + message = "退房接口pms回复信息", + }; + + + SqlSugarBase.GesmartDb().Insertable(pms).ExecuteCommand(); + errorMsg = "退房失败"; + + CheckInYuanShidata data3 = new CheckInYuanShidata(); + data3.RequestId = msgid; + data3.Step = 5; + data3.CurrentTime = DateTime.Now; + data3.ReturnMsg = errorMsg; + + + var vvv1 = JsonConvert.SerializeObject(data1); + CSRedisCacheHelper.Publish(StaticData.PMSLogMonitor, vvv1); + return false; + } + + } + catch (Exception ex) + { + errorMsg = ex.Message; + LogHelper.WriteLog(code + "-" + ex.ToString()); + } + return false; + } + + [WebMethod(Description = "待租
key:验证码(我方提供),code:编码(我方提供),roomNumber:房号,rentDate:变更待租日期,errorMsg:错误信息")] + public bool RentRoom(string key, string code, string roomNumber, DateTime rentDate, ref string errorMsg) + { + + CheckInYuanShidata data1 = new CheckInYuanShidata(); + data1.CommandType = "RentRoom"; + string msgid = Guid.NewGuid().ToString("N"); + string IP = GetClientIP(HttpContext.Current.Request); + + + + ExtraData EEE = null; + string order_original = ""; + try + { + var cookie = HttpContext.Current.Request.Cookies["cookiedomain"]; + if (cookie != null) + { + order_original = HttpUtility.UrlDecode(cookie.Value); + EEE = Newtonsoft.Json.JsonConvert.DeserializeObject(order_original); + order_original = EEE.OriginalData; + IP = EEE.RequestIP; + + data1.JianJieData = new JianJie() { OriginallData = order_original }; + } + } + catch (Exception ex) + { + LogHelper.WriteLog("cookie 出错"); + } + + if (EEE == null) + { + data1.ZhiJieData = new ZhiJie() + { + RentData = new RentData() + { + code = code, + key = key, + roomNumber = roomNumber, + rentDate = rentDate + } + }; + } + + data1.Step = 1; + data1.IP = IP; + data1.RequestId = msgid; + var vvv = JsonConvert.SerializeObject(data1); + CSRedisCacheHelper.Publish(StaticData.PMSLogMonitor, vvv); + if (_key != key) + { + errorMsg = "验证码key(" + key + ")有误"; + return false; + } + if (string.IsNullOrEmpty(code)) + { + errorMsg = "编码不能为空"; + return false; + } + if (string.IsNullOrEmpty(roomNumber)) + { + errorMsg = "房号不能为空"; + return false; + } + try + { + if (BLL.GetHotelCode(code).Rows.Count == 0) + { + errorMsg = "编码code(" + code + ")有误"; + return false; + } + if (BLL.RentRoom(code, roomNumber, rentDate, msgid) > 0) + { + CheckInYuanShidata data3 = new CheckInYuanShidata(); + data3.RequestId = msgid; + data3.Step = 5; + data3.CurrentTime = DateTime.Now; + data3.ReturnMsg = "变更待租成功:" + code + "-" + roomNumber; + + var vvv1 = JsonConvert.SerializeObject(data1); + CSRedisCacheHelper.Publish(StaticData.PMSLogMonitor, vvv1); + + LogHelper.WriteLog("变更待租成功:" + code + "-" + roomNumber); + return true; + } + else + { + + errorMsg = "变更房态失败"; + + CheckInYuanShidata data3 = new CheckInYuanShidata(); + data3.RequestId = msgid; + data3.Step = 5; + data3.CurrentTime = DateTime.Now; + data3.ReturnMsg = errorMsg; + var vvv1 = JsonConvert.SerializeObject(data1); + CSRedisCacheHelper.Publish(StaticData.PMSLogMonitor, vvv1); + + return false; + } + + } + catch (Exception ex) + { + errorMsg = ex.Message; + LogHelper.WriteLog(code + "-" + ex.ToString()); + } + return false; + } + + [WebMethod(Description = "推送数据到宝镜")] + public void PushBaoJing_IsEnable(string key, string code, bool isable) + { + if (key.Equals("7e533rU:#3721M7%")) + { + int a = 0; + if (isable) + { + a = 1; + } + BLL.EnableBaoJing(code, a); + } + } + + [WebMethod(Description = "获取是否推送PMS数据到宝镜")] + public int GetPushBaoJing_IsEnable(string key, string code) + { + int a = 0; + if (key.Equals("7e533rU:#3721M7%")) + { + a = BLL.GetEnableBaoJing(code); + } + return a; + } + + [WebMethod()] + public int AddHotelInfo(string key, string Code, string HotelName, int HotelId) + { + + int a = 0; + try + { + if (key.Equals("7e533rU:#3721M7%")) + { + a = BLL.AddHotelInfo(Code, HotelName, HotelId); + } + } + catch (Exception ex) + { + a = 0; + LogHelper.WriteLog("addhotelinfo error: " + ex.ToString()); + } + return a; + } + + public static readonly string username = ConfigurationManager.AppSettings["BaoJing_username"]; + public static readonly string password = ConfigurationManager.AppSettings["BaoJing_password"]; + /// + /// 推送数据到 宝镜系统 + /// + /// + public void PMSDataPushBaoJing(PMSDataBase p, int abc) + { + //签名加密规则:hotel_code=酒店编码&time=时间戳&key=密钥 + + + //String = ‘blv001-123456’ + //密钥 = MD5(String); + string str = string.Format("{0}-{1}", username, password); + + long lll = Common.GetCurrentTimeStamp(DateTime.Now); + string Key = Common.MD5Encrypt(str); + string SignOriginal = string.Format("hotel_code={0}&time={1}&key={2}", p.hotel_code, lll, Key); + string SignStr = Common.MD5Encrypt(SignOriginal); + p.time = lll.ToString(); + p.sign = SignStr; + + + List pmsinfobj = new List(); + pmsLog pmslogbj = new pmsLog + { + pmsid = pmsid, + app = 1, + step = abc == 1 ? 146 : 147, // 146开房 147退房 + Data = p.ToString(), + Creationtime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")), + message = abc == 1 ? "推送开房信息到宝镜" : "推送退房信息到宝镜", + + }; + pmsinfobj.Add(pmslogbj); + + try + { + if (abc == 1) + { + HttpSendData.SendData(p); + } + else if (abc == 2) + { + HttpSendData.SendData_CheckOut(p); + } + else + { + + } + } + catch (Exception ex) + { + + } + } + + + /// + /// 发送数据到宝镜, + /// 本来应该是宝镜 和PMS数据对接的 + /// + /// + /// + /// + /// + /// + /// + /// + private void ConstructPushData(string code, string roomNumber, DateTime checkInDate, string xmlString, string phoneNumber, string idNumber, string hotelid, string order_original = "") + { + try + { + // + // + // + List llla = new List(); + + // + + XDocument doc1 = XDocument.Parse(xmlString); + XElement Root = doc1.Root; + string orderno = Root.Attribute("orderno")?.Value; + string cost = Root.Attribute("cost")?.Value; + + //是否有早餐 + string breakfast = Root.Attribute("breakfast")?.Value; + //押金 + string deposit = Root.Attribute("deposit")?.Value; + + var LES = Root.Elements("item"); + foreach (var item in LES) + { + Info iia = new Info(); + string customer = item.Attribute("customer").Value; + string sex = item.Attribute("sex").Value; + int sss = 0; + if (sex.Equals("男") || sex.Equals("male")) + { + sss = 1; + } + else + { + sss = 0; + } + iia.sex = sss; + iia.name = customer; + if (string.IsNullOrEmpty(phoneNumber)) + { + phoneNumber = "16618780987"; + } + + iia.mobile = phoneNumber; + if (string.IsNullOrEmpty(idNumber)) + { + idNumber = "410881188908809321"; + } + iia.idcard = idNumber; + iia.address = ""; + llla.Add(iia); + } + + PMSData p = new PMSData(); + p.hotel_code = code; + p.hotel_id = hotelid; + if (string.IsNullOrEmpty(orderno)) + { + p.order_no = Guid.NewGuid().ToString("N"); + } + else + { + p.order_no = orderno; + } + p.room_no = roomNumber; + p.checkIn = checkInDate.ToString("yyyy-MM-dd HH:mm:ss"); + p.checkOut = checkInDate.AddDays(1).ToString("yyyy-MM-dd HH:mm:ss"); + p.is_breakfast = 0; + if (!string.IsNullOrEmpty(breakfast) && breakfast.Equals("1")) + { + p.is_breakfast = 1; + } + p.breakfast = 1; + p.rateCode = ""; + p.amount = deposit; + p.order_original = order_original; + p.infos = llla; + + _logger.Error("给宝镜推送开房数据"); + PMSDataPushBaoJing(p, 1); + } + catch (Exception ex) + { + LogHelper.WriteLog("XmlString: " + xmlString + "," + code + "," + roomNumber); + LogHelper.WriteLog("给宝镜推送数据 error: " + ex.ToString()); + } + } + + private static readonly NLog.Logger _logger = NLog.LogManager.GetCurrentClassLogger(); + public string Task(string key) + { + return ""; + //DataSet ds = SqlHelper.ExecuteDataset(SqlHelper.connectionString, CommandType.Text, "select * from tb_RoomCheck where ID=0"); + //if (ds != null && ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0) + //{ + + //} + //DataTable DT = ds.Tables[0]; + //if (DT != null && DT.Rows.Count > 0) + //{ + //} + //var N = LogManager.GetCurrentClassLogger(); + //Task t = System.Threading.Tasks.Task.Factory.StartNew(() => + //{ + // N.Error("ewr21894328fdklsafaskldhfskadjfhweuiqrweyiur"); + //}); + //t.Wait(); + //var client1 = new RestSharp.RestClient("http://face.blv-oa.com"); + //var request1 = new RestSharp.RestRequest("/FaceRoom/RoomIdbyRoom", RestSharp.Method.POST); + //request1.AddParameter("HotelId", "1101"); + //request1.AddParameter("RoomNum", "1001"); + //var Response = client1.Execute(request1).Content; + //var LLL = JsonConvert.DeserializeObject>(Response); + //GlobalCache.HttpSendDataNew.Add("111"); + + //if (key.Equals("aaccee^_^aaccee")) + //{ + // GlobalCache.Add("aaaaaaaaaaaaaa"); + //} + + //ssl 协议不兼容 + //var A = (SecurityProtocolType)48; + //var B = (SecurityProtocolType)192; + //var C = (SecurityProtocolType)768; + //var D = (SecurityProtocolType)3072; + //var E = (SecurityProtocolType)12288; + //ServicePointManager.SecurityProtocol = A | B | C | D | E; + //PMSDataBase data = new PMSDataBase() + //{ + // hotel_code = "2079", + // time = "1751426235", + // sign = "a68b2596ce7c1ca970e82a00626c16e3", + // hotel_id = "1101", + // order_no = "", + // room_no = "1102", + // check_out_original = "" + //}; + + //string BaseURL = "https://f.blv-oa.com:8099/rcu_pms_api/v1"; + //var client123 = new RestClient(BaseURL); + //var request123 = new RestRequest("/order/checkOut", Method.POST); + //request123.AddJsonBody(data); + //var Response = client123.Execute(request123).Content; + //string content12345 = Response; + //return content12345; + } + + } +} diff --git a/BLWWS/job_scheduling_data_2_0.xsd b/BLWWS/job_scheduling_data_2_0.xsd new file mode 100644 index 0000000..7bff0f0 --- /dev/null +++ b/BLWWS/job_scheduling_data_2_0.xsd @@ -0,0 +1,364 @@ + + + + + + + Root level node + + + + + + Commands to be executed before scheduling the jobs and triggers in this file. + + + + + Directives to be followed while scheduling the jobs and triggers in this file. + + + + + + + + + + + + + + Version of the XML Schema instance + + + + + + + + + + Delete all jobs, if any, in the identified group. "*" can be used to identify all groups. Will also result in deleting all triggers related to the jobs. + + + + + Delete all triggers, if any, in the identified group. "*" can be used to identify all groups. Will also result in deletion of related jobs that are non-durable. + + + + + Delete the identified job if it exists (will also result in deleting all triggers related to it). + + + + + + + + + + + Delete the identified trigger if it exists (will also result in deletion of related jobs that are non-durable). + + + + + + + + + + + + + + + + Whether the existing scheduling data (with same identifiers) will be overwritten. If false, and ignore-duplicates is not false, and jobs or triggers with the same names already exist as those in the file, an error will occur. + + + + + If true (and overwrite-existing-data is false) then any job/triggers encountered in this file that have names that already exist in the scheduler will be ignored, and no error will be produced. + + + + + If true trigger's start time is calculated based on earlier run time instead of fixed value. Trigger's start time must be undefined for this to work. + + + + + + + + Define a JobDetail + + + + + + + + + + + + + + + + + Define a JobDataMap + + + + + + + + + Define a JobDataMap entry + + + + + + + + + + Define a Trigger + + + + + + + + + + + Common Trigger definitions + + + + + + + + + + + + + + + + + + + + + + + Define a SimpleTrigger + + + + + + + + + + + + + + + + + Define a CronTrigger + + + + + + + + + + + + + + + Define a DateIntervalTrigger + + + + + + + + + + + + + + + + Cron expression (see JavaDoc for examples) + + Special thanks to Chris Thatcher (thatcher@butterfly.net) for the regular expression! + + Regular expressions are not my strong point but I believe this is complete, + with the caveat that order for expressions like 3-0 is not legal but will pass, + and month and day names must be capitalized. + If you want to examine the correctness look for the [\s] to denote the + seperation of individual regular expressions. This is how I break them up visually + to examine them: + + SECONDS: + ( + ((([0-9]|[0-5][0-9])(-([0-9]|[0-5][0-9]))?,)*([0-9]|[0-5][0-9])(-([0-9]|[0-5][0-9]))?) + | (([\*]|[0-9]|[0-5][0-9])/([0-9]|[0-5][0-9])) + | ([\?]) + | ([\*]) + ) [\s] + MINUTES: + ( + ((([0-9]|[0-5][0-9])(-([0-9]|[0-5][0-9]))?,)*([0-9]|[0-5][0-9])(-([0-9]|[0-5][0-9]))?) + | (([\*]|[0-9]|[0-5][0-9])/([0-9]|[0-5][0-9])) + | ([\?]) + | ([\*]) + ) [\s] + HOURS: + ( + ((([0-9]|[0-1][0-9]|[2][0-3])(-([0-9]|[0-1][0-9]|[2][0-3]))?,)*([0-9]|[0-1][0-9]|[2][0-3])(-([0-9]|[0-1][0-9]|[2][0-3]))?) + | (([\*]|[0-9]|[0-1][0-9]|[2][0-3])/([0-9]|[0-1][0-9]|[2][0-3])) + | ([\?]) + | ([\*]) + ) [\s] + DAY OF MONTH: + ( + ((([1-9]|[0][1-9]|[1-2][0-9]|[3][0-1])(-([1-9]|[0][1-9]|[1-2][0-9]|[3][0-1]))?,)*([1-9]|[0][1-9]|[1-2][0-9]|[3][0-1])(-([1-9]|[0][1-9]|[1-2][0-9]|[3][0-1]))?(C)?) + | (([1-9]|[0][1-9]|[1-2][0-9]|[3][0-1])/([1-9]|[0][1-9]|[1-2][0-9]|[3][0-1])(C)?) + | (L(-[0-9])?) + | (L(-[1-2][0-9])?) + | (L(-[3][0-1])?) + | (LW) + | ([1-9]W) + | ([1-3][0-9]W) + | ([\?]) + | ([\*]) + )[\s] + MONTH: + ( + ((([1-9]|0[1-9]|1[0-2])(-([1-9]|0[1-9]|1[0-2]))?,)*([1-9]|0[1-9]|1[0-2])(-([1-9]|0[1-9]|1[0-2]))?) + | (([1-9]|0[1-9]|1[0-2])/([1-9]|0[1-9]|1[0-2])) + | (((JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)(-(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC))?,)*(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)(-(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC))?) + | ((JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)/(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)) + | ([\?]) + | ([\*]) + )[\s] + DAY OF WEEK: + ( + (([1-7](-([1-7]))?,)*([1-7])(-([1-7]))?) + | ([1-7]/([1-7])) + | (((MON|TUE|WED|THU|FRI|SAT|SUN)(-(MON|TUE|WED|THU|FRI|SAT|SUN))?,)*(MON|TUE|WED|THU|FRI|SAT|SUN)(-(MON|TUE|WED|THU|FRI|SAT|SUN))?(C)?) + | ((MON|TUE|WED|THU|FRI|SAT|SUN)/(MON|TUE|WED|THU|FRI|SAT|SUN)(C)?) + | (([1-7]|(MON|TUE|WED|THU|FRI|SAT|SUN))(L|LW)?) + | (([1-7]|MON|TUE|WED|THU|FRI|SAT|SUN)#([1-7])?) + | ([\?]) + | ([\*]) + ) + YEAR (OPTIONAL): + ( + [\s]? + ([\*])? + | ((19[7-9][0-9])|(20[0-9][0-9]))? + | (((19[7-9][0-9])|(20[0-9][0-9]))/((19[7-9][0-9])|(20[0-9][0-9])))? + | ((((19[7-9][0-9])|(20[0-9][0-9]))(-((19[7-9][0-9])|(20[0-9][0-9])))?,)*((19[7-9][0-9])|(20[0-9][0-9]))(-((19[7-9][0-9])|(20[0-9][0-9])))?)? + ) + + + + + + + + + + Number of times to repeat the Trigger (-1 for indefinite) + + + + + + + + + + Simple Trigger Misfire Instructions + + + + + + + + + + + + + + + Cron Trigger Misfire Instructions + + + + + + + + + + + + Date Interval Trigger Misfire Instructions + + + + + + + + + + + + Interval Units + + + + + + + + + + + + + \ No newline at end of file diff --git a/BLWWS/nlog.config b/BLWWS/nlog.config new file mode 100644 index 0000000..3a1832e --- /dev/null +++ b/BLWWS/nlog.config @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/BLWWS/packages.config b/BLWWS/packages.config new file mode 100644 index 0000000..9efd80e --- /dev/null +++ b/BLWWS/packages.config @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/BLWWS/syncstatus.asmx b/BLWWS/syncstatus.asmx new file mode 100644 index 0000000..bbdfec0 --- /dev/null +++ b/BLWWS/syncstatus.asmx @@ -0,0 +1 @@ +<%@ WebService Language="C#" CodeBehind="syncstatus.asmx.cs" Class="BLWWS.syncstatus" %> diff --git a/BLWWS/syncstatus.asmx.cs b/BLWWS/syncstatus.asmx.cs new file mode 100644 index 0000000..e694beb --- /dev/null +++ b/BLWWS/syncstatus.asmx.cs @@ -0,0 +1,311 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; +using System.Web.Services; +using System.Data; +using BLWWS_BLL; +using System.Threading.Tasks; + +namespace BLWWS +{ + /// + /// syncstatus 的摘要说明 + /// + [WebService(Namespace = "http://www.blw.com/")] + [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] + [System.ComponentModel.ToolboxItem(false)] + // 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。 + [System.Web.Script.Services.ScriptService] + public class syncstatus : System.Web.Services.WebService + { + /// + /// 获取客户记录 + /// + /// + /// + /// + [WebMethod] + public DataSet GetRoomRecord(string code, string roomNumber, string tableName) + { + try + { + return BLL.GetRoomRecords(code, roomNumber, tableName); + } + catch (Exception ex) + { + LogHelper.WriteLog(ex.ToString()); + } + return null; + } + /// + /// 根据酒店ID,房号获取当前入住人信息 + /// + /// 酒店ID + /// 房号 + /// + [WebMethod] + public string GetRoomCustomerByHotelID(int hotelID, string roomNumber, ref string phoneNumber) + { + try + { + return BLL.GetRoomCustomer(hotelID, roomNumber, ref phoneNumber); + } + catch (Exception ex) + { + LogHelper.WriteLog(ex.ToString()); + } + return ""; + } + /// + /// 获取入住人信息 + /// + /// + /// + [WebMethod] + public DataSet GetRoomCustomer(long checkInID) + { + try + { + return BLL.GetRoomCustomer(checkInID); + } + catch (Exception ex) + { + LogHelper.WriteLog(ex.ToString()); + } + return null; + } + /// + /// 获取酒店编码 + /// + /// + [WebMethod] + public DataSet GetHotelCode() + { + try + { + return BLL.GetHotelCode(); + } + catch (Exception ex) + { + LogHelper.WriteLog(ex.ToString()); + } + return null; + } + /// + /// 获取酒店编码 + /// + /// + [WebMethod] + public DataTable GetHotelByCode(string code) + { + try + { + return BLL.GetHotelCode(code); + } + catch (Exception ex) + { + LogHelper.WriteLog(ex.ToString()); + } + return null; + } + /// + /// 定时获取酒店新的开房/退房/待租记录 + /// + /// 酒店编码 + /// + [WebMethod] + public DataSet GetCheckInOrOutRecord(string code) + { + try + { + return BLL.GetCheckInOrOutRecord(code); + } + catch (Exception ex) + { + LogHelper.WriteLog(ex.ToString()); + } + return null; + } + /// + /// 获取人脸机设备信息 + /// + /// + /// + [WebMethod] + public DataSet GetDevices(string code) + { + try + { + return BLL.GetDevices(code); + } + catch (Exception ex) + { + LogHelper.WriteLog(ex.ToString()); + } + return null; + } + /// + /// 人脸机绑定房号 + /// + /// + /// + /// + /// + [WebMethod] + public int SaveDevice(long id, string hotelCode, string roomNumber) + { + try + { + return BLL.SaveDevice(id, hotelCode, roomNumber); + } + catch (Exception ex) + { + LogHelper.WriteLog(ex.ToString()); + } + return 0; + } + /// + /// 更新已同步的新开房/退房/待租状态 + /// + /// 酒店编码 + /// 记录ID + /// 0开房,1退房,2待租 + /// + [WebMethod] + public int UpdateCheckInOrOutRecord(string code, Int64 id, int flag) + { + try + { + return BLL.UpdateCheckInOrOutRecord(code, id, flag); + } + catch (Exception ex) + { + LogHelper.WriteLog(ex.ToString()); + } + return 0; + } + /// + /// 判断验证码是否正确 + /// + /// 酒店ID + /// 房号 + /// 用户输入验证码 + /// + [WebMethod] + public bool ValidateNumber(int hotelID, string roomNumber, string validateCode) + { + try + { + return BLL.ValidateNumber(hotelID, roomNumber, validateCode); + } + catch (Exception ex) + { + LogHelper.WriteLog(ex.ToString()); + } + return false; + } + /// + /// 判断验证码是否正确 + /// + /// 酒店编码 + /// 房号 + /// 用户输入验证码 + /// + [WebMethod] + public bool ValidateNumberByCode(string code, string roomNumber, string validateCode) + { + try + { + return BLL.ValidateNumberByCode(code, roomNumber, validateCode); + } + catch (Exception ex) + { + LogHelper.WriteLog(ex.ToString()); + } + return false; + } + /// + /// 根据手机号获取当前入住记录信息 + /// + /// + /// + [WebMethod] + public DataTable GetCodeAndRoomNumberByPhone(string phone) + { + try + { + return BLL.GetCodeAndRoomNumberByPhone(phone); + } + catch (Exception ex) + { + LogHelper.WriteLog(ex.ToString()); + } + return null; + } + /// + /// 上传/变更图像及信息 + /// + /// 证件类型:0身份证,1护照 + /// 证件号码 + /// 姓名 + /// 性别:0女,1男 + /// 图像 + /// + [WebMethod] + public bool UploadPhoto(int idType, string idCard, string name, int sex, string birthday, byte[] photo) + { + try + { + if (BLL.UploadPhoto(idType, idCard, name, sex, birthday, photo) > 0) + { + return true; + } + } + catch (Exception ex) + { + LogHelper.WriteLog(ex.ToString()); + } + return false; + } + /// + /// 人脸识别 + /// + /// + /// + /// + /// + /// + /// + /// + [WebMethod] + public bool FaceMatch(byte[] photo, ref int idType, ref string idCard, ref string name, ref int sex, ref byte[] matchPhoto) + { + try + { + return BLL.FaceMatch(photo, ref idType, ref idCard, ref name, ref sex, ref matchPhoto); + } + catch (Exception ex) + { + LogHelper.WriteLog(ex.ToString()); + } + return false; + } + + //[WebMethod] + //public int SendSMS(string phoneNumber) + //{ + // try + // { + // string validateCode = Tools.CreateValidateCode(4); + // //发送短信验证码 + // AliyunSMSHelper.SendVerifySMS(phoneNumber, validateCode); + // } + // catch (Exception ex) + // { + // LogHelper.WriteLog(ex.ToString()); + // } + // return 0; + //} + } +} diff --git a/BLWWS_BLL/AliyunSMSHelper.cs b/BLWWS_BLL/AliyunSMSHelper.cs new file mode 100644 index 0000000..fae7b87 --- /dev/null +++ b/BLWWS_BLL/AliyunSMSHelper.cs @@ -0,0 +1,70 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Aliyun.Acs.Core; +using Aliyun.Acs.Core.Profile; +using Aliyun.Acs.Core.Exceptions; +using Aliyun.Acs.Dysmsapi.Model.V20170525; + +namespace BLWWS_BLL +{ + public static class AliyunSMSHelper + { + /// + /// 发送验证码 + /// + /// 接收号码,多个号码可以逗号分隔 + /// 验证码 + public static void SendVerifySMS(string recNum, string code) + { + SendSMS(recNum, "{'code':'" + code + "'}"); + } + /// + /// 发送验证码 + /// + /// 接收号码,多个号码可以逗号分隔 + /// 短信模板中的变量;数字需要转换为字符串;个人用户每个变量长度必须小于15个字符。 + /// + private static void SendSMS(string recNum, string paramString) + { + IClientProfile profile = DefaultProfile.GetProfile("cn-hangzhou", "LTAICuIny2zJSSjm", "uguZzmshKPtT0fW87E8sP1TXe7Kwc9"); + //IAcsClient client = new DefaultAcsClient(profile); + //SingleSendSmsRequest request = new SingleSendSmsRequest(); + DefaultProfile.AddEndpoint("cn-hangzhou", "cn-hangzhou", "Dysmsapi", "dysmsapi.aliyuncs.com");//短信API产品名称,短信API产品域名 + IAcsClient acsClient = new DefaultAcsClient(profile); + SendSmsRequest request = new SendSmsRequest(); + try + { + //request.SignName = "小威提示";//"管理控制台中配置的短信签名(状态必须是验证通过)" + //request.TemplateCode = "SMS_95095011";//"管理控制台中配置的审核通过的短信模板的模板CODE(状态必须是验证通过)" + //request.RecNum = recNum; + //request.ParamString = paramString; + //SingleSendSmsResponse httpResponse = client.GetAcsResponse(request); + + //必填:待发送手机号。支持以逗号分隔的形式进行批量调用,批量上限为20个手机号码,批量调用相对于单条调用及时性稍有延迟,验证码类型的短信推荐使用单条调用的方式 + request.PhoneNumbers = recNum; + //必填:短信签名-可在短信控制台中找到 + request.SignName = "小威提示"; + //必填:短信模板-可在短信控制台中找到 + request.TemplateCode = "SMS_95095011"; + //可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为 + request.TemplateParam = paramString;// "{\"customer\":\"123\"}"; + //可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者 + //request.OutId = "21212121211"; + //请求失败这里会抛ClientException异常 + //SendSmsResponse sendSmsResponse = + acsClient.GetAcsResponse(request); + //LogHelper.WriteLog(sendSmsResponse.Message); + } + catch (ServerException e) + { + LogHelper.WriteLog(e.ToString()); + } + catch (ClientException e) + { + LogHelper.WriteLog(e.ToString()); + } + } + } +} diff --git a/BLWWS_BLL/BLL.cs b/BLWWS_BLL/BLL.cs new file mode 100644 index 0000000..9c0e4ac --- /dev/null +++ b/BLWWS_BLL/BLL.cs @@ -0,0 +1,1228 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; +using System.Xml; +using System.Data; +using System.Data.SqlClient; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using System.Text; +//using static System.Windows.Forms.VisualStyles.VisualStyleElement.StartPanel; +using System.Windows.Forms; +using System.Data.SqlTypes; +using System.Xml.Linq; +using System.Web.UI.WebControls; +using System.Net.NetworkInformation; +using System.Text.RegularExpressions; +using System.IO; +using MySql.Data.MySqlClient; +using System.Runtime.CompilerServices; +using System.Web.Caching; +using Quartz; +using BLWWS_BLL.Job; +using BLWWS_BLL.Common; + +namespace BLWWS_BLL +{ + public static class BLL + { + //设置APPID/AK/SK,可以到百度申请,链接:https://console.bce.baidu.com/ai/?fromai=1#/ai/face/app/list + //var APP_ID = "10461316"; + //private static string API_KEY = "2HDaFPcV5cY3mXqwLf4UeuVW";//用于人脸识别 + //private static string SECRET_KEY = "B122PgXT6GBif67mTGztURZoKDC9XEe3";//用于人脸识别 + + private static readonly string _face_url = System.Configuration.ConfigurationManager.AppSettings["face_url"]; + private static readonly string _face_url_new = System.Configuration.ConfigurationManager.AppSettings["face_url_new"]; + private static readonly int ImageMaxHeight = int.Parse(System.Configuration.ConfigurationManager.AppSettings["ImageMaxHeight"]); + private static readonly int ImageMaxWidth = int.Parse(System.Configuration.ConfigurationManager.AppSettings["ImageMaxWidth"]); + private static readonly int ImageMinHeight = int.Parse(System.Configuration.ConfigurationManager.AppSettings["ImageMinHeight"]); + private static readonly int ImageMinWidth = int.Parse(System.Configuration.ConfigurationManager.AppSettings["ImageMinWidth"]); + /// + /// 获取酒店记录 + /// + /// 酒店编码 + /// + public static DataTable GetHotelCode(string code) + { + string sql = "select * from tb_HotelCode where code='" + code + "'"; + return SqlHelper.ExecuteDataset(SqlHelper.connectionString, CommandType.Text, sql).Tables[0]; + } + /// + /// 获取所有酒店 + /// + /// + public static DataSet GetHotelCode() + { + string sql = "select Code,Remark,HotelID from tb_HotelCode order by Remark"; + return SqlHelper.ExecuteDataset(SqlHelper.connectionString, CommandType.Text, sql); + } + + public static void EnableBaoJing(string hotelcode, int isenable) + { + string sql = "update tb_HotelCode set Is_Push_BaoJing=@baojing where Code=@code;"; + SqlParameter p1 = new SqlParameter("@code", hotelcode); + SqlParameter p2 = new SqlParameter("@baojing", isenable); + SqlHelper.ExecuteNonQuery(SqlHelper.connectionString, CommandType.Text, sql, new SqlParameter[] { p1, p2 }); + } + public static int AddHotelInfo(string hotelcode, string hotelname, int hotelid) + { + string sql = "insert into tb_HotelCode(Code,Remark,HotelID) values(@code,@hotelName,@hotelid)"; + SqlParameter p1 = new SqlParameter("@code", hotelcode); + SqlParameter p2 = new SqlParameter("@hotelName", hotelname); + SqlParameter p3 = new SqlParameter("@hotelid", hotelid); + return SqlHelper.ExecuteNonQuery(SqlHelper.connectionString, CommandType.Text, sql, new SqlParameter[] { p1, p2, p3 }); + } + + public static int GetEnableBaoJing(string code) + { + string sql = "select Is_Push_BaoJing from tb_HotelCode where code=@code;"; + SqlParameter p1 = new SqlParameter("@code", code); + object ooo = SqlHelper.ExecuteScalar(SqlHelper.connectionString, CommandType.Text, sql, new SqlParameter[] { p1 }); + int ia = 0; + int.TryParse(ooo.ToString(), out ia); + return ia; + } + /// + /// 开房 + /// + /// 酒店编码 + /// 房号 + /// 入住日期 + /// 入住客人信息 + /// 手机号码,多个已逗号,隔开 + /// 身份证号:用于获取验证码 + /// 入住记录ID + /// + public static int CheckIn(string code, string roomNumber, DateTime checkInDate, string xmlString, int YesNoFace, string key, ref long checkInID, string phoneNumber = "", string idNumber = "", string MsgId = "") + { + + CheckInYuanShidata data1 = new CheckInYuanShidata(); + data1.RequestId = MsgId; + data1.Step = 2; + data1.CurrentTime = DateTime.Now; + var vvv = JsonConvert.SerializeObject(data1); + CSRedisCacheHelper.Publish(StaticData.PMSLogMonitor, vvv); + + //判断该房号是否已退房 + string sql = "select ID from tb_RoomCheck where Code='" + code + "' and RoomNumber='" + roomNumber + "' and isnull(CheckOutDate,'')=''"; + DataSet ds = SqlHelper.ExecuteDataset(SqlHelper.connectionString, CommandType.Text, sql); + #region 新添加的代码 + if (YesNoFace == 1) + { + try + { + bool containsInvalidChar = Regex.IsMatch(xmlString, @"[\x00-\x08\x0B-\x0C\x0E-\x1F]"); + if (containsInvalidChar) + { + LogHelper.WriteLog("传递的xml文件格式不正确"); + } + XDocument doc = XDocument.Parse(xmlString); + Dictionary customerInfo = new Dictionary(); + foreach (var item in doc.Descendants("item")) + { + string customer = item.Attribute("customer").Value; + string sex = item.Attribute("sex").Value; + customerInfo[customer] = sex; + } + foreach (var kvp in customerInfo) + { + string ip = ""; + // 获取所有网络接口 + NetworkInterface[] interfaces = NetworkInterface.GetAllNetworkInterfaces(); + // 遍历每个网络接口 + foreach (NetworkInterface networkInterface in interfaces) + { + // 获取IP地址 + IPInterfaceProperties ipProperties = networkInterface.GetIPProperties(); + UnicastIPAddressInformationCollection ipAddresses = ipProperties.UnicastAddresses; + // 遍历每个IP地址 + foreach (UnicastIPAddressInformation ipAddress in ipAddresses) + { + // 判断是否为IPv4地址 + if (ipAddress.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) + { + //过滤本地ip + if (ipAddress.Address.ToString() != "127.0.0.1") + { + //局域网ip + ip = ipAddress.Address.ToString(); + } + } + } + } + Uploadinfo uploadinfo = new Uploadinfo() + { + key = key, + code = code, + checkInID = checkInID, + idType = 0, + idCard = idNumber, + name = kvp.Key, + sex = kvp.Value == "男" ? 1 : 0, + //birthday = birthday, + //photoUrl = photoUrl, + //photo = "photo.Length_"+ photo.Length, + }; + string jsonString = JsonConvert.SerializeObject(uploadinfo); + PmsInterface info = new PmsInterface() + { + pmstype = 1, + DateTime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")), + pmsContent = jsonString, + hotelid = -1, + }; + int pmsid = SqlSugarBase.GesmartDb().Insertable(info).ExecuteReturnIdentity(); + if (containsInvalidChar) + { + pmsLog pmslog1 = new pmsLog + { + pmsid = pmsid, + app = 1, + step = 100, + Data = xmlString, + Creationtime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")), + message = "XML文件格式不正确", + Ip = ip + }; + SqlSugarBase.GesmartDb().Insertable(pmslog1).ExecuteCommand(); + } + pmsLog pmslogs = new pmsLog + { + pmsid = pmsid, + app = 1, + step = 101, + Data = jsonString, + Creationtime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")), + message = "pms CheckIn服务收到信息", + Ip = ip + }; + SqlSugarBase.GesmartDb().Insertable(pmslogs).ExecuteCommand(); + //Console.WriteLine($"Customer: {kvp.Key}, Sex: {kvp.Value}"); + StringBuilder sb = new StringBuilder(); + sb.Append("/checkinInterface?key=abc&data="); + var postData = new + { + LodgerNmae = kvp.Key, + IDNumber = idNumber, + Sex = kvp.Value == "男" ? 1 : 0, + picture = "", + HotelCode = code, + roomid = roomNumber, + phonenumber = phoneNumber, + CheckTime = Convert.ToDateTime(checkInDate).ToString("yyyy-MM-dd HH:mm:ss"), + pmsinfoid = pmsid + }; + sb.Append(Newtonsoft.Json.JsonConvert.SerializeObject(postData)); + pmsLog pmslog = new pmsLog + { + pmsid = pmsid, + app = 1, + step = 102, + Data = sb.ToString(), + Creationtime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")), + message = "pms CheckIn 服务转发信息成功", + HotelCode = code, + roomid = roomNumber + }; + SqlSugarBase.GesmartDb().Insertable(pmslog).ExecuteCommand(); + string strResult = Tools.PostWebRequest(_face_url + sb.ToString(), "");//调用人脸机接口 + LogHelper.WriteLog("没有人脸机的开房信息:" + sb.ToString()); + LogHelper.WriteLog(_face_url + sb.ToString() + ",没有人脸机的开房信息结果:" + strResult); + } + } + catch (Exception ex) + { + LogHelper.WriteLog("没有人脸机的推送给服务器信息错误:" + ex.ToString()); + } + } + #endregion + //如果该房号尚未退房,只是更新客人信息 + if (ds.Tables[0].Rows.Count > 0) + { + sql = "update tb_RoomCheck set XmlString='" + xmlString + "' where Code='" + code + "' and RoomNumber='" + roomNumber + "' and isnull(CheckOutDate,'')=''"; + checkInID = Convert.ToInt64(ds.Tables[0].Rows[0]["ID"]); + + + + CheckInYuanShidata data2 = new CheckInYuanShidata(); + data2.RequestId = MsgId; + data2.Step = 3; + data2.CurrentTime = DateTime.Now; + + + var vvv1 = JsonConvert.SerializeObject(data1); + CSRedisCacheHelper.Publish(StaticData.PMSLogMonitor, vvv1); + return SqlHelper.ExecuteNonQuery(SqlHelper.connectionString, CommandType.Text, sql); + } + else + { + string validateCode = "8888"; + //判断是否使用微信功能,如果是发送验证码,默认取身份证后四位 + if (Convert.ToBoolean(GetHotelCode(code).Rows[0]["UserWX"])) + { + if (!string.IsNullOrEmpty(idNumber)) + { + validateCode = ""; + foreach (string id in idNumber.Split(',')) + { + if (id.Length > 3) + { + validateCode += id.Substring(id.Length - 4) + ","; + } + } + } + //if (code == "1001" || code == "BLW_Hotel")//云端默认酒店和200服务器 + //{ + // if (!string.IsNullOrEmpty(phoneNumber)) + // { + // validateCode = Tools.CreateValidateCode(4); + // AliyunSMSHelper.SendVerifySMS(phoneNumber, validateCode);//发送短信验证码 + // } + //} + } + sql = "insert into tb_RoomCheck(Code,RoomNumber,XmlString,CheckInDate,PhoneNumber,IDNumber,ValidateCode) values('" + code + "','" + + roomNumber + "','" + xmlString + "','" + checkInDate.ToString("yyyy-MM-dd HH:mm:ss") + "','" + phoneNumber + "','" + idNumber + "','" + validateCode + "');"; + //LogHelper.WriteLog(sql); + object result = SqlHelper.ExecuteScalar(SqlHelper.connectionString, CommandType.Text, sql + "select @@IDENTITY as 'ID'"); + checkInID = Convert.ToInt64(result); + if (checkInID > 0) + { + //同步房态 + return 1; + } + + + CheckInYuanShidata data2 = new CheckInYuanShidata(); + data2.RequestId = MsgId; + data2.Step = 3; + data2.CurrentTime = DateTime.Now; + + + var vvv1 = JsonConvert.SerializeObject(data1); + CSRedisCacheHelper.Publish(StaticData.PMSLogMonitor, vvv1); + return 0; + } + } + /// + /// 更改住客手机号码 + /// + /// 酒店编码 + /// 房号 + /// 新手机号码,多个已逗号,隔开 + /// 身份证号:用于获取验证码 + /// + public static int ChangePhoneNumber(string code, string roomNumber, string phoneNumber = "", string idNumber = "") + { + //判断该房号是否已退房 + string sql = "select ID from tb_RoomCheck where Code='" + code + "' and RoomNumber='" + roomNumber + "' and isnull(CheckOutDate,'')=''"; + DataSet ds = SqlHelper.ExecuteDataset(SqlHelper.connectionString, CommandType.Text, sql); + //如果该房号尚未退房,只是更新客人电话号码信息 + if (ds.Tables[0].Rows.Count > 0) + { + string validateCode = "8888"; + //判断是否使用微信功能,如果是发送验证码,默认取身份证后四位 + if (Convert.ToBoolean(GetHotelCode(code).Rows[0]["UserWX"])) + { + if (!string.IsNullOrEmpty(idNumber)) + { + validateCode = ""; + foreach (string id in idNumber.Split(',')) + { + if (id.Length > 4) + { + validateCode += id.Substring(id.Length - 4) + ","; + } + } + } + if (code == "1001" || code == "BLW_Hotel")//云端默认酒店和200服务器 + { + if (!string.IsNullOrEmpty(phoneNumber)) + { + validateCode = Tools.CreateValidateCode(4); + AliyunSMSHelper.SendVerifySMS(phoneNumber, validateCode);//发送短信验证码 + } + } + } + sql = "update tb_RoomCheck set PhoneNumber='" + phoneNumber + "',IDNumber='" + idNumber + "',ValidateCode='" + validateCode + "' where Code='" + + code + "' and RoomNumber='" + roomNumber + "' and isnull(CheckOutDate,'')=''"; + + return SqlHelper.ExecuteNonQuery(SqlHelper.connectionString, CommandType.Text, sql); + } + return 0; + } + /// + /// 退房 + /// + /// 酒店编码 + /// 房号 + /// 退房日期 + /// /// pms编号 + /// + public static int CheckOut(string code, string roomNumber, DateTime checkOutDate, int pmsid, string MsgId) + { + + CheckInYuanShidata data1 = new CheckInYuanShidata(); + data1.CommandType = "CheckOut"; + data1.RequestId = MsgId; + data1.Step = 2; + data1.CurrentTime = DateTime.Now; + + var vvv = JsonConvert.SerializeObject(data1); + CSRedisCacheHelper.Publish(StaticData.PMSLogMonitor, vvv); + + string sqls = " select * from tb_RoomCheck where Code='" + code + "' and RoomNumber='" + roomNumber + "' and isnull(CheckOutDate,'')=''"; + DataSet ds = SqlHelper.ExecuteDataset(SqlHelper.connectionString, CommandType.Text, sqls); + int result = 0; + if (ds != null && ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0) + { + string sql = "update tb_RoomCheck set CheckOutDate='" + checkOutDate.ToString("yyyy-MM-dd HH:mm:ss") + "' where Code='" + code + "' and RoomNumber='" + roomNumber + "' and isnull(CheckOutDate,'')=''"; + result = SqlHelper.ExecuteNonQuery(SqlHelper.connectionString, CommandType.Text, sql); + if (result > 0 && !string.IsNullOrEmpty(_face_url)) + { + try + { + + StringBuilder sb = new StringBuilder(); + sb.Append("/CheckOut?key=abc&data="); + var postData = new { HotelCode = code, roomid = roomNumber, checkOutTime = checkOutDate.ToString("yyyy-MM-dd HH:mm:ss"), pmsinfoid = pmsid }; + sb.Append(Newtonsoft.Json.JsonConvert.SerializeObject(postData)); + pmsLog pmslog = new pmsLog + { + pmsid = pmsid, + app = 1, + step = 102, + Data = sb.ToString(), + Creationtime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")), + message = "pms服务转发信息成功", + HotelCode = code, + roomid = roomNumber + }; + SqlSugarBase.GesmartDb().Insertable(pmslog).ExecuteCommand(); + LogHelper.WriteLog("新添加的代码:" + sb.ToString()); + string strResult = Tools.PostWebRequest(_face_url + sb.ToString(), "");//调用人脸机接口 + LogHelper.WriteLog(_face_url + sb.ToString() + ",结果:" + strResult); + } + catch (Exception ex) + { + pmsLog pmslog = new pmsLog + { + pmsid = pmsid, + app = 1, + step = 140, + //Data = sb.ToString(), + Creationtime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")), + message = "pms服务转发信息失败", + HotelCode = code, + roomid = roomNumber + }; + SqlSugarBase.GesmartDb().Insertable(pmslog).ExecuteCommand(); + LogHelper.WriteLog(ex.ToString()); + } + } + + CheckInYuanShidata data2 = new CheckInYuanShidata(); + data2.RequestId = MsgId; + data2.Step = 3; + data2.CurrentTime = DateTime.Now; + + var vvv1 = JsonConvert.SerializeObject(data2); + CSRedisCacheHelper.Publish(StaticData.PMSLogMonitor, vvv1); + } + else + { + string sql = "insert into tb_RoomCheck (CheckOutDate,Code,RoomNumber,CheckInDate,SyncCheckIn,SyncCheckOut,SyncRent) values " + + "('" + checkOutDate.ToString("yyyy-MM-dd HH:mm:ss") + + "','" + code + + "','" + roomNumber + + "','" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + + "'," + 0 + + "," + 1 + + "," + 0 + + ")"; + result = SqlHelper.ExecuteNonQuery(SqlHelper.connectionString, CommandType.Text, sql); + if (result > 0 && !string.IsNullOrEmpty(_face_url)) + { + try + { + + StringBuilder sb = new StringBuilder(); + sb.Append("/CheckOut?key=abc&data="); + var postData = new { HotelCode = code, roomid = roomNumber, checkOutTime = checkOutDate.ToString("yyyy-MM-dd HH:mm:ss"), pmsinfoid = pmsid }; + sb.Append(Newtonsoft.Json.JsonConvert.SerializeObject(postData)); + pmsLog pmslog = new pmsLog + { + pmsid = pmsid, + app = 1, + step = 102, + Data = sb.ToString(), + Creationtime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")), + message = "pms服务转发信息成功", + HotelCode = code, + roomid = roomNumber + }; + SqlSugarBase.GesmartDb().Insertable(pmslog).ExecuteCommand(); + LogHelper.WriteLog("新添加的代码:" + sb.ToString()); + string strResult = Tools.PostWebRequest(_face_url + sb.ToString(), "");//调用人脸机接口 + LogHelper.WriteLog(_face_url + sb.ToString() + ",结果:" + strResult); + } + catch (Exception ex) + { + pmsLog pmslog = new pmsLog + { + pmsid = pmsid, + app = 1, + step = 141, + //Data = sb.ToString(), + Creationtime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")), + message = "pms服务转发信息失败", + HotelCode = code, + roomid = roomNumber + }; + LogHelper.WriteLog(ex.ToString()); + } + } + + CheckInYuanShidata data2 = new CheckInYuanShidata(); + data2.CommandType = "CheckOut"; + data2.RequestId = MsgId; + data2.Step = 3; + data2.CurrentTime = DateTime.Now; + + var vvv1 = JsonConvert.SerializeObject(data2); + CSRedisCacheHelper.Publish(StaticData.PMSLogMonitor, vvv1); + } + return result; + } + /// + /// 待租 + /// + /// 酒店编码 + /// 房号 + /// 变更待租日期 + /// + public static int RentRoom(string code, string roomNumber, DateTime rentDate,string MsgId) + { + try + { + + CheckInYuanShidata data1 = new CheckInYuanShidata(); + data1.CommandType = "RentRoom"; + data1.RequestId = MsgId; + data1.Step = 2; + data1.CurrentTime = DateTime.Now; + + var vvv = JsonConvert.SerializeObject(data1); + CSRedisCacheHelper.Publish(StaticData.PMSLogMonitor, vvv); + string sql = " select * from tb_RoomCheck where Code='" + code + "' and RoomNumber='" + roomNumber + "' and isnull(CheckOutDate,'')=''"; + DataSet ds = SqlHelper.ExecuteDataset(SqlHelper.connectionString, CommandType.Text, sql); + if (ds != null && ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0) + { + sql = "update tb_RoomCheck set RentDate='" + rentDate.ToString("yyyy-MM-dd HH:mm:ss") + "' where Code='" + code + "' and RoomNumber='" + roomNumber + "'"; + LogHelper.WriteLog("修改待租信息"); + } + else + { + sql = "insert into tb_RoomCheck (RentDate,Code,RoomNumber,CheckInDate,SyncCheckIn,SyncCheckOut,SyncRent) values " + + "('" + rentDate.ToString("yyyy-MM-dd HH:mm:ss") + + "','" + code + + "','" + roomNumber + + "','" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + + "'," + 0 + + "," + 0 + + "," + 1 + + ")"; + LogHelper.WriteLog("添加待租信息"); + } + + CheckInYuanShidata data2 = new CheckInYuanShidata(); + data2.CommandType = "RentRoom"; + data2.RequestId = MsgId; + data2.Step = 3; + data2.CurrentTime = DateTime.Now; + + var vvv2 = JsonConvert.SerializeObject(data2); + CSRedisCacheHelper.Publish(StaticData.PMSLogMonitor, vvv2); + + return SqlHelper.ExecuteNonQuery(SqlHelper.connectionString, CommandType.Text, sql); + } + catch (Exception ex) + { + LogHelper.WriteLog("变更待租错误:" + ex); + return 0; + } + } + /// + /// 获取客房记录 + /// + /// + /// + /// + public static DataSet GetRoomRecords(string code, string roomNumber, string tableName) + { + //if (string.IsNullOrEmpty(tableName)) + //{ + // tableName = "tb_RoomCheck"; + //} + //string sql = "select ID,RoomNumber,CheckInDate,SyncCheckIn,CheckOutDate,SyncCheckOut,RentDate,SyncRent,PhoneNumber,IDNumber,ValidateCode from " + + // tableName + " where Code='" + code + "' and RoomNumber like '%" + roomNumber + "%' order by ID desc"; + string sql = string.Format("select * from(" + + "select ID,RoomNumber,CheckInDate,SyncCheckIn,CheckOutDate,SyncCheckOut,RentDate,SyncRent,PhoneNumber,IDNumber,ValidateCode " + + "from tb_RoomCheck where Code='{0}' and RoomNumber like '%{1}%' " + + "union " + + "select ID,RoomNumber,CheckInDate,SyncCheckIn,CheckOutDate,SyncCheckOut,RentDate,SyncRent,PhoneNumber,IDNumber,ValidateCode " + + "from tb_RoomCheck_bak where Code='{2}' and RoomNumber like '%{3}%') x " + + "order by x.ID desc", code, roomNumber, code, roomNumber); + return SqlHelper.ExecuteDataset(SqlHelper.connectionString, CommandType.Text, sql); + } + /// + /// 获取入住人信息 + /// + /// + /// + public static DataSet GetRoomCustomer(long checkInID) + { + string sql = string.Format("select *,'' as StatusName,'' as SexName from tb_RoomCustomer where CheckInID={0}", checkInID); + return SqlHelper.ExecuteDataset(SqlHelper.connectionString, CommandType.Text, sql); + } + /// + /// 定时获取酒店新的开房/退房/待租记录 + /// + /// 酒店编码 + /// + public static DataSet GetCheckInOrOutRecord(string code) + { + if (string.IsNullOrEmpty(code)) + { + return null; + } + SqlParameter[] parameters = { new SqlParameter("@code", SqlDbType.VarChar, 30) }; + parameters[0].Value = code; + return SqlHelper.ExecuteDataset(SqlHelper.connectionString, CommandType.StoredProcedure, "sp_GetCheckInOrOutRecord", parameters); + } + /// + /// 更新已同步的新开房/退房/待租状态 + /// + /// 酒店编码 + /// 记录ID + /// 0开房,1退房,2待租 + /// + public static int UpdateCheckInOrOutRecord(string code, Int64 id, int flag) + { + string cloumnName = ""; + switch (flag) + { + case 0: + cloumnName = "SyncCheckIn"; + break; + case 1: + cloumnName = "SyncCheckOut"; + break; + case 2: + cloumnName = "SyncRent"; + break; + } + if (!string.IsNullOrEmpty(cloumnName)) + { + string sql = "update tb_RoomCheck set " + cloumnName + "=1 where ID=" + id + " and Code='" + code + "'"; + return SqlHelper.ExecuteNonQuery(SqlHelper.connectionString, CommandType.Text, sql); + } + //string sql = ""; + //switch (flag) + //{ + // case 0: + // sql = "update tb_RoomCheck set SyncRent=0,SyncCheckOut=0,SyncCheckIn=1 where ID=" + id + " and Code='" + code + "'"; + // LogHelper.WriteLog("同步开房状态"); + // break; + // case 1: + // sql = "update tb_RoomCheck set SyncRent=0,SyncCheckOut=1,SyncCheckIn=0 where ID=" + id + " and Code='" + code + "'"; + // LogHelper.WriteLog("同步退房状态"); + // break; + // case 2: + // sql = "update tb_RoomCheck set SyncRent=1,SyncCheckOut=0,SyncCheckIn=0 where ID=" + id + " and Code='" + code + "'"; + // LogHelper.WriteLog("同步待租状态"); + // break; + //} + //int count = SqlHelper.ExecuteNonQuery(SqlHelper.connectionString, CommandType.Text, sql); + //if (count>0) + //{ + // return count; + //} + return 0; + } + /// + /// 根据酒店ID,房号获取当前入住人信息 + /// + /// 酒店ID + /// 房号 + /// + public static string GetRoomCustomer(int hotelID, string roomNumber, ref string phoneNumber) + { + StringBuilder sql = new StringBuilder(); + sql.Append("select r.XmlString,r.PhoneNumber from tb_RoomCheck r inner join tb_HotelCode h on r.Code=h.Code where h.HotelID=" + hotelID + " and r.RoomNumber='" + roomNumber + "' and isnull(r.CheckOutDate,'')=''"); + sql.Append(" union "); + sql.Append("select r.XmlString,r.PhoneNumber from tb_RoomCheck_bak r inner join tb_HotelCode h on r.Code=h.Code where h.HotelID=" + hotelID + " and r.RoomNumber='" + roomNumber + "' and isnull(r.CheckOutDate,'')=''"); + + DataSet ds = SqlHelper.ExecuteDataset(SqlHelper.connectionString, CommandType.Text, sql.ToString()); + + if (ds.Tables.Count > 0) + { + foreach (DataRow row in ds.Tables[0].Rows) + { + phoneNumber = row[1].ToString(); + return row[0].ToString(); + } + } + return ""; + } + /// + /// 判断验证码是否正确 + /// + /// 酒店ID + /// 房号 + /// 用户输入验证码 + /// + public static bool ValidateNumber(int hotelID, string roomNumber, string validateCode) + { + //根据酒店ID,房号和手机验证码查找记录 + StringBuilder sql = new StringBuilder(); + sql.Append("select r.ValidateCode from tb_RoomCheck r inner join tb_HotelCode h on r.Code=h.Code where h.HotelID=" + hotelID + " and r.RoomNumber='" + roomNumber + "' and isnull(r.CheckOutDate,'')=''"); + sql.Append(" union "); + sql.Append("select r.ValidateCode from tb_RoomCheck_bak r inner join tb_HotelCode h on r.Code=h.Code where h.HotelID=" + hotelID + " and r.RoomNumber='" + roomNumber + "' and isnull(r.CheckOutDate,'')=''"); + + DataSet ds = SqlHelper.ExecuteDataset(SqlHelper.connectionString, CommandType.Text, sql.ToString()); + + if (ds.Tables.Count > 0) + { + foreach (DataRow row in ds.Tables[0].Rows) + { + if (null != row[0] && !string.IsNullOrEmpty(row[0].ToString())) + { + foreach (string v1 in row[0].ToString().Split(',')) + { + if (v1 == validateCode) + { + return true; + } + } + } + } + } + return false; + } + /// + /// 判断验证码是否正确 + /// + /// 酒店编码 + /// 房号 + /// 用户输入验证码 + /// + public static bool ValidateNumberByCode(string code, string roomNumber, string validateCode) + { + //根据酒店Code,房号和手机验证码查找记录 + StringBuilder sql = new StringBuilder(); + sql.Append("select r.ValidateCode from tb_RoomCheck r where r.Code='" + code + "' and r.RoomNumber='" + roomNumber + "' and isnull(r.CheckOutDate,'')=''"); + sql.Append(" union "); + sql.Append("select r.ValidateCode from tb_RoomCheck_bak r where r.Code='" + code + "' and r.RoomNumber='" + roomNumber + "' and isnull(r.CheckOutDate,'')=''"); + + DataSet ds = SqlHelper.ExecuteDataset(SqlHelper.connectionString, CommandType.Text, sql.ToString()); + + if (ds.Tables.Count > 0) + { + foreach (DataRow row in ds.Tables[0].Rows) + { + if (null != row[0] && !string.IsNullOrEmpty(row[0].ToString())) + { + foreach (string v1 in row[0].ToString().Split(',')) + { + if (v1 == validateCode) + { + return true; + } + } + } + } + } + return false; + } + /// + /// 根据手机号获取当前入住记录信息 + /// + /// + /// + public static DataTable GetCodeAndRoomNumberByPhone(string phone) + { + StringBuilder sql = new StringBuilder(); + sql.Append("select r.* from tb_RoomCheck r where r.PhoneNumber like '%" + phone + "%' and isnull(r.CheckOutDate,'')=''"); + sql.Append(" union "); + sql.Append("select r.* from tb_RoomCheck_bak r where r.PhoneNumber like '%" + phone + "%' and isnull(r.CheckOutDate,'')=''"); + + DataSet ds = SqlHelper.ExecuteDataset(SqlHelper.connectionString, CommandType.Text, sql.ToString()); + + if (ds.Tables.Count > 0) + { + return ds.Tables[0]; + } + return null; + } + /// + /// 上传/变更图像及信息 + /// + /// 证件类型:0身份证,1护照 + /// 证件号码 + /// 姓名 + /// 性别:0女,1男 + /// 图像 + /// + public static int UploadPhoto(int idType, string idCard, string name, int sex, string birthday, byte[] photo) + { + //根据身份类型和编号获取记录 + string sql = "select r.ID from tb_RoomCustomer r where r.IDType=" + idType + " and r.IDCard='" + idCard + "'"; + DataSet ds = SqlHelper.ExecuteDataset(SqlHelper.connectionString, CommandType.Text, sql); + + if (ds != null && ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0) + { + sql = "update tb_RoomCustomer set IDType=@IDType,IDCard=@IDCard,Name=@Name,Sex=@Sex,Birthday=@Birthday,Photo=@Photo,ModifiedDate=getdate() where ID=" + Convert.ToInt16(ds.Tables[0].Rows[0][0]); + } + else + { + sql = "insert into tb_RoomCustomer (IDType,IDCard,[Name],Sex,Birthday,Photo) values (@IDType,@IDCard,@Name,@Sex,@Birthday,@Photo)"; + } + SqlParameter[] sqlParams = new SqlParameter[6] { + new SqlParameter("@IDType", idType), + new SqlParameter("@IDCard", idCard), + new SqlParameter("@Name", name), + new SqlParameter("@Sex", sex), + new SqlParameter("@Birthday", birthday), + new SqlParameter("@Photo", photo)}; + return SqlHelper.ExecuteNonQuery(SqlHelper.connectionString, CommandType.Text, sql, sqlParams); + } + /// + /// 上传图片 + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + public static int UploadPhoto(int idType, string idCard, string name, int sex, string birthday, string photoUrl, byte[] photo, long checkInID, int pmsid, ref string msg) + { + + if (!string.IsNullOrEmpty(photoUrl))//取云端图片内容保存在数据库 + { + try + { + System.Net.HttpWebRequest webRequest = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(photoUrl); + webRequest.Method = "GET"; + System.Net.HttpWebResponse webResponse = (System.Net.HttpWebResponse)webRequest.GetResponse(); + System.IO.Stream s = webResponse.GetResponseStream(); + List list = new List(); + while (true) + { + int data = s.ReadByte(); + if (data == -1) + break; + else + { + byte b = (byte)data; + list.Add(b); + } + } + photo = list.ToArray(); + } + catch (Exception) + { + pmsLog pms = new pmsLog + { + pmsid = pmsid, + app = 1, + step = 142, + //Data = sb.ToString(), + Creationtime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")), + message = "读取云端图片失败", + }; + SqlSugarBase.GesmartDb().Insertable(pms).ExecuteCommand(); + } + } + else + { + if (photo == null) + { + pmsLog pmsinfo = new pmsLog + { + pmsid = pmsid, + app = 1, + step = 143, + //Data = sb.ToString(), + Creationtime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")), + message = "图片内容为空", + }; + SqlSugarBase.GesmartDb().Insertable(pmsinfo).ExecuteCommand(); + //LogHelper.WriteLog(string.Format("图片内容不能为空。checkInID:{0}", checkInID)); + return 0; + } + string picName = idCard + "_" + checkInID.ToString() + ".jpg";//二进制转换为本地图片 + using (System.IO.FileStream fs = new System.IO.FileStream(LogHelper.ExePath + "\\pic\\" + picName, System.IO.FileMode.Create, System.IO.FileAccess.Write)) + { + fs.Write(photo, 0, photo.Length); + photoUrl = "http://pms.boonlive-rcu.com:89/pic/" + picName; + } + } + + + string sql = "insert into tb_RoomCustomer (IDType,IDCard,[Name],Sex,Birthday,PhotoUrl,Photo,CheckInID) values (@IDType,@IDCard,@Name,@Sex,@Birthday,@PhotoUrl,@Photo,@CheckInID)"; + SqlParameter[] sqlParams = new SqlParameter[8] { + new SqlParameter("@IDType", idType), + new SqlParameter("@IDCard", idCard), + new SqlParameter("@Name", name), + new SqlParameter("@Sex", sex), + new SqlParameter("@Birthday", birthday), + new SqlParameter("@PhotoUrl", photoUrl), + new SqlParameter("@Photo", photo), + new SqlParameter("@CheckInID", checkInID)}; + int result = SqlHelper.ExecuteNonQuery(SqlHelper.connectionString, CommandType.Text, sql, sqlParams); + if (result > 0 && !string.IsNullOrEmpty(_face_url)) + { + try + { + + DataSet ds = SqlHelper.ExecuteDataset(SqlHelper.connectionString, CommandType.Text, "select * from tb_RoomCheck where ID=" + checkInID); + //if (ds != null && ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0) + DataTable DT = ds.Tables[0]; + if (DT != null && DT.Rows.Count > 0) + { + //DataRow dr = ds.Tables[0].Rows[0]; + DataRow dr = DT.Rows[0]; + StringBuilder sb = new StringBuilder(); + sb.Append("/checkinInterface?key=abc&data="); + var postData = new + { + LodgerNmae = name, + IDNumber = idCard, + Sex = sex, + picture = photoUrl, + HotelCode = dr["Code"].ToString(), + roomid = dr["RoomNumber"].ToString(), + phonenumber = dr["PhoneNumber"].ToString(), + CheckTime = Convert.ToDateTime(dr["CheckInDate"]).ToString("yyyy-MM-dd HH:mm:ss"), + pmsinfoid = pmsid + }; + sb.Append(Newtonsoft.Json.JsonConvert.SerializeObject(postData)); + + #region 新添加代码 + pmsLog pmslog = new pmsLog + { + pmsid = pmsid, + app = 1, + step = 102, + Data = sb.ToString(), + Creationtime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")), + message = "pms服务转发信息成功", + HotelCode = dr["Code"].ToString(), + roomid = dr["RoomNumber"].ToString() + }; + SqlSugarBase.GesmartDb().Insertable(pmslog).ExecuteCommand(); + //LogHelper.WriteLog("新添加的代码:" + sb.ToString()); + + + //查询人脸 机的状态 和故障 + string hotelid = ""; + DataTable dt = GetHotelCode(postData.HotelCode); + string Key = "HotelCode_" + postData.HotelCode; + object ooo = HttpContext.Current.Cache.Get(Key); + if (ooo != null) + { + hotelid = ooo.ToString(); + } + else + { + if (dt != null && dt.Rows.Count > 0) + { + hotelid = dt.Rows[0]["HotelID"].ToString(); + HttpContext.Current.Cache.Insert(Key, hotelid, null, DateTime.Now.AddMinutes(20), Cache.NoSlidingExpiration); + } + } + + + + //查询人脸机连接状态 + LogHelper.WriteLog("查询人脸机在线:" + hotelid + ":" + postData.roomid); + var client1 = new RestSharp.RestClient(_face_url_new); + var request1 = new RestSharp.RestRequest("/FaceRoom/RoomIdbyRoom", RestSharp.Method.POST); + request1.AddParameter("HotelId", hotelid); + request1.AddParameter("RoomNum", postData.roomid); + var Response = client1.Execute(request1).Content; + var LLL = JsonConvert.DeserializeObject>(Response); + FaceResult r = new FaceResult(); + var DDD = LLL.FirstOrDefault(); + if (DDD != null) + { + //人脸机 是否在线 + bool Is_OnLine = DDD.Status; + int GuZhang = DDD.maintainStatus; + if (Is_OnLine) + { + r.Status = 200; + r.Message = "人脸机在线"; + } + else + { + r.Status = 403; + r.Message = "人脸机离线"; + } + + //人脸机出故障了 + /*if (GuZhang == 0) + { + r.Status = 200; + r.Message = "人脸机无故障,正常使用"; + } + else + { + r.Status = 403; + r.Message = "人脸机不可用"; + }*/ + } + else + { + r.Status = 403; + r.Message = "找不到该房间的人脸机数据"; + } + + //分辨率 判断 + using (var ms = new MemoryStream(photo)) + { + ms.Write(photo, 0, photo.Length); + using (System.Drawing.Image image = System.Drawing.Image.FromStream(ms, false, false)) // 不加载图像数据 + { + decimal nnn1 = Convert.ToDecimal(photo.Length); + decimal lll = nnn1 / 1024; + decimal a = Math.Round(lll, 2); + string message = "图片分辨率 W:" + image.Width + " H:" + image.Height + "图片大小: " + a + "KB"; + LogHelper.WriteLog(message); + pmsLog pmslog_fenbianlv = new pmsLog + { + pmsid = pmsid, + app = 1, + step = 144, + Creationtime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")), + message = message + " " + r.Message, + }; + SqlSugarBase.GesmartDb().Insertable(pmslog_fenbianlv).ExecuteCommand(); + + #region 分辨率判断 + //bool bf = image.RawFormat.Equals(System.Drawing.Imaging.ImageFormat.Jpeg); + //if (image.Width > ImageMaxWidth || image.Height > ImageMaxHeight) + //{ + // LogHelper.WriteLog("图片分辨率太大"); + // pmsLog pmslog = new pmsLog + // { + // pmsid = pmsid, + // app = 1, + // step = 0, + // Creationtime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")), + // message = "图片分辨率太大 W:" + image.Width + " H:" + image.Height, + // }; + // SqlSugarBase.GesmartDb().Insertable(pmslog).ExecuteCommand(); + // return 0; + //} + + //if (image.Width < ImageMinWidth || image.Height < ImageMinHeight) + //{ + // LogHelper.WriteLog("图片分辨率太小 W:" + image.Width + " H:" + image.Height); + // pmsLog pmslog = new pmsLog + // { + // pmsid = pmsid, + // app = 1, + // step = 0, + // Creationtime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")), + // message = "图片分辨率太小", + // }; + // SqlSugarBase.GesmartDb().Insertable(pmslog).ExecuteCommand(); + // return 0; + //} + #endregion + } + } + + LogHelper.WriteLog("人脸机在线结果:" + Response); + #endregion + + #region 原来的人脸机判定结果 + //string strResult = ""; + //if (pmslog.HotelCode.Equals("2079")) + //{ + // strResult = Tools.PostWebRequestNew(_face_url + sb.ToString(), "");//调用人脸机接口 + //} + //else + //{ + // strResult = Tools.PostWebRequest(_face_url + sb.ToString(), "");//调用人脸机接口 + //} + //LogHelper.WriteLog(_face_url + sb.ToString() + ",结果:" + strResult); + //FaceResult faceReslut = Newtonsoft.Json.JsonConvert.DeserializeObject(strResult); + + //if (faceReslut != null && faceReslut.Status == 200) + //{ + // result = 1; + //} + //else + //{ + // result = 0; + //} + #endregion + + #region 换成后台任务 + try + { + if (sb != null) + { + string sbstr = sb.ToString(); + string pullstr = _face_url + sbstr; + LogHelper.WriteLog("face pull data:" + pullstr); + if (!string.IsNullOrEmpty(pullstr)) + { + GlobalCache.Add(pullstr); + } + } + } + catch (Exception ex) + { + LogHelper.WriteLog("Error: " + ex.Message); + } + if (r != null && r.Status == 200) + { + result = 1; + } + else + { + result = 0; + msg = r.Status + " " + r.Message; + } + #endregion + } + else if (checkInID == 0) + { + pmsLog pms_111 = new pmsLog + { + pmsid = pmsid, + app = 1, + step = 100, + Creationtime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")), + message = "checkinId 为 0" + }; + SqlSugarBase.GesmartDb().Insertable(pms_111).ExecuteCommand(); + result = 0; + msg = pms_111.message; + return result; + } + } + catch (Exception ex) + { + pmsLog pmslog = new pmsLog + { + pmsid = pmsid, + app = 1, + step = 145, + //Data = sb.ToString(), + Creationtime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")), + message = "pms服务转发信息失败", + //HotelCode = dr["Code"].ToString(), + //roomid = dr["RoomNumber"].ToString() + }; + SqlSugarBase.GesmartDb().Insertable(pmslog).ExecuteCommand(); + result = 0; + LogHelper.WriteLog(ex.ToString()); + } + } + return result; + } + /// + /// 人脸识别 + /// + /// + /// + /// + /// + /// + /// + /// + public static bool FaceMatch(byte[] photo, ref int idType, ref string idCard, ref string name, ref int sex, ref byte[] matchPhoto) + { + if (!photo.Equals(null)) + { + string sql = "select * from tb_RoomCustomer"; + DataSet ds = SqlHelper.ExecuteDataset(SqlHelper.connectionString, CommandType.Text, sql); + //if (ds != null && ds.Tables.Count > 0) + //{ + // var client = new Baidu.Aip.Face.Face(API_KEY, SECRET_KEY); + + // foreach (DataRow dr in ds.Tables[0].Rows) + // { + // var images = new byte[][] { photo, (byte[])dr["Photo"] }; + // var result = double.Parse(client.FaceMatch(images).First.First.Last.Last.First.ToString()); + // if (result >= 90) + // { + // idType = (int)dr["IDType"]; + // idCard = dr["IDCard"].ToString(); + // name = dr["Name"].ToString(); + // sex = (int)dr["Sex"]; + // matchPhoto = (byte[])dr["Photo"]; + // return true; + // } + // } + //} + return false; + } + return false; + } + /// + /// 获取人脸机信息 + /// + /// + /// + public static DataSet GetDevices(string code) + { + string sql = string.Format("select a.*,b.Remark from tb_Devices a left join tb_HotelCode b on a.HotelCode=b.Code where isnull(a.HotelCode,'')='' or isnull(a.HotelCode,'') like '%{0}%' order by a.HotelCode desc,a.RoomNumber,a.SerialNo", code); + return SqlHelper.ExecuteDataset(SqlHelper.connectionString, CommandType.Text, sql); + } + /// + /// 人脸机绑定房号 + /// + /// + /// + /// + /// + public static int SaveDevice(long id, string hotelCode, string roomNumber) + { + string sql = string.Format("update tb_Devices set HotelCode='{1}',RoomNumber='{2}',ModifiedDate=getdate() where ID={0}", id, hotelCode, roomNumber); + return SqlHelper.ExecuteNonQuery(SqlHelper.connectionString, CommandType.Text, sql); + } + } + public class FaceResult + { + /// + /// + /// + public int Status { get; set; } + /// + /// + /// + public string Message { get; set; } + } + public class FaceStatus + { + public int Facelid { get; set; } + public string SerialNo { get; set; } + public string CreatedDate { get; set; } + public int RoomId { get; set; } + public bool Status { get; set; } + public bool bindingStatus { get; set; } + public int maintainStatus { get; set; } + public string ROOM_NUMBER { get; set; } + } +} \ No newline at end of file diff --git a/BLWWS_BLL/BLWWS_BLL.csproj b/BLWWS_BLL/BLWWS_BLL.csproj new file mode 100644 index 0000000..d58ed51 --- /dev/null +++ b/BLWWS_BLL/BLWWS_BLL.csproj @@ -0,0 +1,115 @@ + + + + Debug + AnyCPU + 8.0.30703 + 2.0 + {CF2AB5DE-C3AF-4388-B6C4-EFA14BAF3316} + Library + Properties + BLWWS_BLL + BLWWS_BLL + v4.0 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\dll\aliyun-net-sdk-core.dll + + + ..\dll\aliyun-net-sdk-dysmsapi.dll + + + ..\packages\Common.Logging.3.3.1\lib\net40\Common.Logging.dll + + + ..\packages\Common.Logging.Core.3.3.1\lib\net40\Common.Logging.Core.dll + + + ..\packages\CSRedisCore.3.8.806\lib\net40\CSRedisCore.dll + + + ..\packages\MySql.Data.6.7.9\lib\net40\MySql.Data.dll + + + ..\packages\Newtonsoft.Json.13.0.3\lib\net40\Newtonsoft.Json.dll + + + ..\packages\NLog.6.0.0\lib\net35\NLog.dll + + + ..\packages\Quartz.2.6.2\lib\net40\Quartz.dll + + + ..\BLWWS\RestSharp\RestSharp.dll + + + ..\packages\sqlSugar.4.9.9.11\lib\SqlSugar.dll + + + + + + + ..\packages\System.ValueTuple.4.5.0\lib\portable-net40+sl4+win8+wp8\System.ValueTuple.dll + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Designer + + + + + + \ No newline at end of file diff --git a/BLWWS_BLL/GlobalCache.cs b/BLWWS_BLL/GlobalCache.cs new file mode 100644 index 0000000..22d675b --- /dev/null +++ b/BLWWS_BLL/GlobalCache.cs @@ -0,0 +1,121 @@ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using BLWWS_BLL.Job; +using NLog; +using Quartz; +using Quartz.Impl; +using LogManager = NLog.LogManager; + +namespace BLWWS_BLL +{ + public class GlobalCache + { + public static ISchedulerFactory sf = null; + public static IScheduler sched = null; + + public static ConcurrentQueue GlobalCacheData = new ConcurrentQueue(); + + public static System.Timers.Timer timer; + private static readonly Logger _logger = LogManager.GetCurrentClassLogger(); + public static void Init() + { + _logger.Error("初始化"); + if (timer == null) + { + timer = new System.Timers.Timer(); + timer.Interval = 500; + timer.Elapsed -= Timer_Elapsed; + timer.Elapsed += Timer_Elapsed; + timer.Start(); + } + + } + + private static void Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) + { + try + { + if (GlobalCache.GlobalCacheData.TryDequeue(out string data)) + { + if (!string.IsNullOrEmpty(data)) + { + string strResult = Tools.PostWebRequest(data, "");//调用人脸机接口 + _logger.Error("人脸 后台:" + strResult); + } + } + } + catch (Exception ex) + { + _logger.Error("人脸 后台异常:" + ex.Message); + } + } + public static void Add(string jobData) + { + + if (timer == null) + { + timer = new System.Timers.Timer(); + timer.Interval = 500; + timer.Elapsed -= Timer_Elapsed; + timer.Elapsed += Timer_Elapsed; + timer.Start(); + } + else + { + + } + _logger.Error("后台来了任务"); + GlobalCacheData.Enqueue(jobData); + //if (sf == null) + //{ + // Init(); + //} + //DateTimeOffset runTime = DateTimeOffset.UtcNow.AddSeconds(2); + + //string JobName = "Job" + System.Guid.NewGuid().ToString("N"); + //string TriggerName = "Trigger" + System.Guid.NewGuid().ToString("N"); + //IJobDetail job = JobBuilder.Create() + // .WithIdentity(JobName, "group1") + // .UsingJobData("JobData", jobData) + // .Build(); + + //// Trigger the job to run on the next round minute + //ITrigger trigger = TriggerBuilder.Create() + // .WithIdentity(TriggerName, "group1") + // .StartAt(runTime) + // .Build(); + + //GlobalCache.sched.ScheduleJob(job, trigger); + } + public static void TaskAdd(string jobData) + { + if (sched != null) + { + DateTimeOffset runTime = DateTimeOffset.UtcNow.AddSeconds(2); + + string JobName = "Job" + System.Guid.NewGuid().ToString("N"); + string TriggerName = "Trigger" + System.Guid.NewGuid().ToString("N"); + IJobDetail job = JobBuilder.Create() + .WithIdentity(JobName, "group1") + .UsingJobData("JobData", jobData) + .Build(); + + // Trigger the job to run on the next round minute + ITrigger trigger = TriggerBuilder.Create() + .WithIdentity(TriggerName, "group1") + .StartAt(runTime) + .Build(); + + GlobalCache.sched.ScheduleJob(job, trigger); + } + else + { + LogHelper.WriteLog("初始化"); + } + } + } +} diff --git a/BLWWS_BLL/HttpJob.cs b/BLWWS_BLL/HttpJob.cs new file mode 100644 index 0000000..112c107 --- /dev/null +++ b/BLWWS_BLL/HttpJob.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; +using BLWWS_BLL; +using Quartz; + +namespace BLWWS_BLL.Job +{ + public class HttpJob : IJob + { + public void Execute(IJobExecutionContext context) + { + try + { + var mmm = context.JobDetail.JobDataMap; + var nnn = mmm.GetString("JobData"); + + //string str = Tools.PostWebRequest(nnn, "");//调用人脸机接口 + //LogHelper.WriteLog("后台人脸机的结果:" + str); + LogHelper.WriteLog("执行任务"+nnn); + } + catch (Exception ex) + { + //LogHelper.WriteLog("后台人脸机异常:" + ex.Message); + LogHelper.WriteLog("后台异常:" + ex.Message); + } + } + } +} \ No newline at end of file diff --git a/BLWWS_BLL/LogHelper.cs b/BLWWS_BLL/LogHelper.cs new file mode 100644 index 0000000..5c007f5 --- /dev/null +++ b/BLWWS_BLL/LogHelper.cs @@ -0,0 +1,132 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.IO; +using System.Web; + +namespace BLWWS_BLL +{ + /// + /// 日志辅助类 + /// + public static class LogHelper + { + public static string ExePath = HttpContext.Current.Request.PhysicalApplicationPath; + /// + /// 日志写入到批定的文件路径下 + /// + /// + public static void WriteLog(string msg, string path = "") + { + if (string.IsNullOrEmpty(path)) + { + path = ExePath; + } + path = path + "\\logs\\" + DateTime.Now.ToString("yyyyMMdd") + ".log"; + msg = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":\t" + + HttpContext.Current.Request.UserHostAddress + ":" + msg + Environment.NewLine; + WriteLog(path, msg, true); + } + public static void WriteLogNew(string msg, string path = "") + { + if (string.IsNullOrEmpty(path)) + { + path = ExePath; + } + path = path + "\\logs\\" + DateTime.Now.ToString("yyyyMMdd") + ".log"; + msg = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":\t" + msg + Environment.NewLine; + WriteLog(path, msg, true); + } + /// + /// 把数据写入指定的文件里 + /// + /// 文件路径(包括文件名称) + /// 写入内容 + /// 是否追加 + public static void WriteLog(string path, string msg, bool append) + { + string folder = Path.GetDirectoryName(path); + if (!Directory.Exists(folder)) + { + Directory.CreateDirectory(folder); + } + StreamWriter sw = null; + try + { + sw = new StreamWriter(path, append, Encoding.Unicode); + sw.WriteLine(msg); + } + catch (Exception) + { + } + finally + { + if (sw != null) + { + sw.Close(); + } + } + } + /// + /// 把数据写入指定的文件里 + /// + /// + /// + public static void WriteLog(string path, byte[] msg) + { + string folder = Path.GetDirectoryName(path); + if (!Directory.Exists(folder)) + { + Directory.CreateDirectory(folder); + } + FileStream fs = null; + try + { + fs = new FileStream(path, FileMode.Append, FileAccess.Write); + fs.Write(msg, 0, msg.Length); + } + catch (Exception) + { + } + finally + { + if (fs != null) + { + fs.Close(); + } + } + } + /// + /// 读取文件内容 + /// + /// + /// + public static string ReadLog(string path) + { + if (File.Exists(path)) + { + StreamReader sr = null; + try + { + sr = new StreamReader(path); + return sr.ReadToEnd(); + } + catch (Exception) + { + } + finally + { + if (sr != null) + { + sr.Close(); + } + } + + } + return ""; + } + } +} + + diff --git a/BLWWS_BLL/LogHelperForService.cs b/BLWWS_BLL/LogHelperForService.cs new file mode 100644 index 0000000..dc0e09c --- /dev/null +++ b/BLWWS_BLL/LogHelperForService.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using System.IO; + +namespace BLWWS_BLL +{ + public static class LogHelperForService + { + private static string ExePath = Application.StartupPath; + /// + /// 日志写入到批定的文件路径下 + /// + /// + public static void WriteLog(string msg) + { + string path = ExePath + "\\logs\\" + DateTime.Now.ToString("yyyyMMdd") + ".log"; + msg = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":\t " + msg + Environment.NewLine; + WriteLog(path, msg, true); + } + /// + /// 把数据写入指定的文件里 + /// + /// 文件路径(包括文件名称) + /// 写入内容 + /// 是否追加 + public static void WriteLog(string path, string msg, bool append) + { + string folder = Path.GetDirectoryName(path); + if (!Directory.Exists(folder)) + { + Directory.CreateDirectory(folder); + } + StreamWriter sw = null; + try + { + sw = new StreamWriter(path, append, Encoding.Unicode); + sw.WriteLine(msg); + } + catch (Exception) + { + } + finally + { + if (sw != null) + { + sw.Close(); + } + } + } + } +} diff --git a/BLWWS_BLL/PmsInterface.cs b/BLWWS_BLL/PmsInterface.cs new file mode 100644 index 0000000..2f1b406 --- /dev/null +++ b/BLWWS_BLL/PmsInterface.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace BLWWS_BLL +{ + public class PmsInterface + { + public int pmsId { get; set; } + public System.DateTime DateTime { get; set; } + public string pmsContent { get; set; } + public int hotelid { get; set; } + public Nullable room { get; set; } + public string faceSN { get; set; } + public Nullable issueresult { get; set; } + public Nullable pmstype { get; set; } + public string messageid { get; set; } + } +} diff --git a/BLWWS_BLL/Properties/AssemblyInfo.cs b/BLWWS_BLL/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..b86c2d4 --- /dev/null +++ b/BLWWS_BLL/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的常规信息通过以下 +// 特性集控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("BLWWS_BLL")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("BLWWS_BLL")] +[assembly: AssemblyCopyright("Copyright © 2015")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 使此程序集中的类型 +// 对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型, +// 则将该类型上的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("20d6c689-5d18-49a0-9f86-58f8584bc7ef")] + +// 程序集的版本信息由下面四个值组成: +// +// 主版本 +// 次版本 +// 内部版本号 +// 修订号 +// +// 可以指定所有这些值,也可以使用“内部版本号”和“修订号”的默认值, +// 方法是按如下所示使用“*”: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/BLWWS_BLL/SqlHelper.cs b/BLWWS_BLL/SqlHelper.cs new file mode 100644 index 0000000..b5d67f7 --- /dev/null +++ b/BLWWS_BLL/SqlHelper.cs @@ -0,0 +1,4232 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Data.SqlClient; +using System.Data; +using System.Xml; +using System.Collections; + +namespace BLWWS_BLL +{ + /// + /// SqlServer数据访问帮助类 + /// + public sealed class SqlHelper + { + /// + /// 数据库连接字符串 + /// + public static readonly string connectionString = System.Configuration.ConfigurationManager.AppSettings["connectionString"]; + + #region 私有构造函数和方法 + + private SqlHelper() { } + + /// + /// 将SqlParameter参数数组(参数值)分配给SqlCommand命令. + /// 这个方法将给任何一个参数分配DBNull.Value; + /// 该操作将阻止默认值的使用. + /// + /// 命令名 + /// SqlParameters数组 + private static void AttachParameters(SqlCommand command, SqlParameter[] commandParameters) + { + + if (command == null) throw new ArgumentNullException("command"); + if (commandParameters != null) + { + foreach (SqlParameter p in commandParameters) + { + if (p != null) + { + // 检查未分配值的输出参数,将其分配以DBNull.Value. + if ((p.Direction == ParameterDirection.InputOutput || p.Direction == ParameterDirection.Input) && + (p.Value == null)) + { + p.Value = DBNull.Value; + } + command.Parameters.Add(p); + } + } + } + } + /// + /// 将DataRow类型的列值分配到SqlParameter参数数组. + /// + /// 要分配值的SqlParameter参数数组 + /// 将要分配给存储过程参数的DataRow + private static void AssignParameterValues(SqlParameter[] commandParameters, DataRow dataRow) + { + if ((commandParameters == null) || (dataRow == null)) + { + return; + } + + int i = 0; + // 设置参数值 + foreach (SqlParameter commandParameter in commandParameters) + { + // 创建参数名称,如果不存在,只抛出一个异常. + if (commandParameter.ParameterName == null || + commandParameter.ParameterName.Length <= 1) + throw new Exception( + string.Format("请提供参数{0}一个有效的名称{1}.", i, commandParameter.ParameterName)); + // 从dataRow的表中获取为参数数组中数组名称的列的索引. + // 如果存在和参数名称相同的列,则将列值赋给当前名称的参数. + if (dataRow.Table.Columns.IndexOf(commandParameter.ParameterName.Substring(1)) != -1) + commandParameter.Value = dataRow[commandParameter.ParameterName.Substring(1)]; + i++; + } + } + /// + /// 将一个对象数组分配给SqlParameter参数数组. + /// + /// 要分配值的SqlParameter参数数组 + /// 将要分配给存储过程参数的对象数组 + private static void AssignParameterValues(SqlParameter[] commandParameters, object[] parameterValues) + { + if ((commandParameters == null) || (parameterValues == null)) + { + return; + } + + // 确保对象数组个数与参数个数匹配,如果不匹配,抛出一个异常. + if (commandParameters.Length != parameterValues.Length) + { + throw new ArgumentException("参数值个数与参数不匹配."); + } + + // 给参数赋值 + for (int i = 0, j = commandParameters.Length; i < j; i++) + { + // If the current array value derives from IDbDataParameter, then assign its Value property + if (parameterValues[i] is IDbDataParameter) + { + IDbDataParameter paramInstance = (IDbDataParameter)parameterValues[i]; + if (paramInstance.Value == null) + { + commandParameters[i].Value = DBNull.Value; + } + else + { + commandParameters[i].Value = paramInstance.Value; + } + } + else if (parameterValues[i] == null) + { + commandParameters[i].Value = DBNull.Value; + } + else + { + commandParameters[i].Value = parameterValues[i]; + } + } + } + /// + /// 预处理用户提供的命令,数据库连接/事务/命令类型/参数 + /// + /// 要处理的SqlCommand + /// 数据库连接 + /// 一个有效的事务或者是null值 + /// 命令类型 (存储过程,命令文本, 其它.) + /// 存储过程名或都T-SQL命令文本 + /// 和命令相关联的SqlParameter参数数组,如果没有参数为'null' + /// true 如果连接是打开的,则为true,其它情况下为false. + private static void PrepareCommand(SqlCommand command, SqlConnection connection, SqlTransaction transaction, CommandType commandType, string commandText, SqlParameter[] commandParameters, out bool mustCloseConnection) + { + if (command == null) throw new ArgumentNullException("command"); + if (commandText == null || commandText.Length == 0) throw new ArgumentNullException("commandText"); + // If the provided connection is not open, we will open it + if (connection.State != ConnectionState.Open) + { + mustCloseConnection = true; + connection.Open(); + } + else + { + mustCloseConnection = false; + } + + // 给命令分配一个数据库连接. + command.Connection = connection; + // 设置命令文本(存储过程名或SQL语句) + command.CommandText = commandText; + // 分配事务 + if (transaction != null) + { + if (transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction"); + command.Transaction = transaction; + } + // 设置命令类型. + command.CommandType = commandType; + // 分配命令参数 + if (commandParameters != null) + { + AttachParameters(command, commandParameters); + } + return; + } + + #endregion 私有构造函数和方法结束 + + #region ExecuteNonQuery命令 + + /// + + /// 执行指定连接字符串,类型的SqlCommand. + + /// + + /// + + /// 示例: + + /// int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, "PublishOrders"); + + /// + + /// 一个有效的数据库连接字符串 + + /// 命令类型 (存储过程,命令文本, 其它.) + + /// 存储过程名称或SQL语句 + + /// 返回命令影响的行数 + + public static int ExecuteNonQuery(string connectionString, CommandType commandType, string commandText) + { + + return ExecuteNonQuery(connectionString, commandType, commandText, (SqlParameter[])null); + + } + + + + /// + + /// 执行指定连接字符串,类型的SqlCommand.如果没有提供参数,不返回结果. + + /// + + /// + + /// 示例: + + /// int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24)); + + /// + + /// 一个有效的数据库连接字符串 + + /// 命令类型 (存储过程,命令文本, 其它.) + + /// 存储过程名称或SQL语句 + + /// SqlParameter参数数组 + + /// 返回命令影响的行数 + + public static int ExecuteNonQuery(string connectionString, CommandType commandType, string commandText, params SqlParameter[] commandParameters) + { + + if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString"); + + using (SqlConnection connection = new SqlConnection(connectionString)) + { + + connection.Open(); + + return ExecuteNonQuery(connection, commandType, commandText, commandParameters); + + } + + } + + + + /// + + /// 执行指定连接字符串的存储过程,将对象数组的值赋给存储过程参数, + + /// 此方法需要在参数缓存方法中探索参数并生成参数. + + /// + + /// + + /// 这个方法没有提供访问输出参数和返回值. + + /// 示例: + + /// int result = ExecuteNonQuery(connString, "PublishOrders", 24, 36); + + /// + + /// 一个有效的数据库连接字符串/param> + + /// 存储过程名称 + + /// 分配到存储过程输入参数的对象数组 + + /// 返回受影响的行数 + + public static int ExecuteNonQuery(string connectionString, string spName, params object[] parameterValues) + { + + if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString"); + + if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName"); + + // 如果存在参数值 + + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + + // 从探索存储过程参数(加载到缓存)并分配给存储过程参数数组. + + SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connectionString, spName); + + // 给存储过程参数赋值 + + AssignParameterValues(commandParameters, parameterValues); + + return ExecuteNonQuery(connectionString, CommandType.StoredProcedure, spName, commandParameters); + + } + + else + { + + // 没有参数情况下 + + return ExecuteNonQuery(connectionString, CommandType.StoredProcedure, spName); + + } + + } + + + + /// + + /// 执行指定数据库连接对象的命令 + + /// + + /// + + /// 示例: + + /// int result = ExecuteNonQuery(conn, CommandType.StoredProcedure, "PublishOrders"); + + /// + + /// 一个有效的数据库连接对象 + + /// 命令类型(存储过程,命令文本或其它.) + + /// 存储过程名称或T-SQL语句 + + /// 返回影响的行数 + + public static int ExecuteNonQuery(SqlConnection connection, CommandType commandType, string commandText) + { + + return ExecuteNonQuery(connection, commandType, commandText, (SqlParameter[])null); + + } + + + + /// + + /// 执行指定数据库连接对象的命令 + + /// + + /// + + /// 示例: + + /// int result = ExecuteNonQuery(conn, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24)); + + /// + + /// 一个有效的数据库连接对象 + + /// 命令类型(存储过程,命令文本或其它.) + + /// T存储过程名称或T-SQL语句 + + /// SqlParamter参数数组 + + /// 返回影响的行数 + + public static int ExecuteNonQuery(SqlConnection connection, CommandType commandType, string commandText, params SqlParameter[] commandParameters) + { + + if (connection == null) throw new ArgumentNullException("connection"); + + // 创建SqlCommand命令,并进行预处理 + + SqlCommand cmd = new SqlCommand(); + + bool mustCloseConnection = false; + + PrepareCommand(cmd, connection, (SqlTransaction)null, commandType, commandText, commandParameters, out mustCloseConnection); + + + + // Finally, execute the command + + int retval = cmd.ExecuteNonQuery(); + + + + // 清除参数,以便再次使用. + + cmd.Parameters.Clear(); + + if (mustCloseConnection) + + connection.Close(); + + return retval; + + } + + + + /// + + /// 执行指定数据库连接对象的命令,将对象数组的值赋给存储过程参数. + + /// + + /// + + /// 此方法不提供访问存储过程输出参数和返回值 + + /// 示例: + + /// int result = ExecuteNonQuery(conn, "PublishOrders", 24, 36); + + /// + + /// 一个有效的数据库连接对象 + + /// 存储过程名 + + /// 分配给存储过程输入参数的对象数组 + + /// 返回影响的行数 + + public static int ExecuteNonQuery(SqlConnection connection, string spName, params object[] parameterValues) + { + + if (connection == null) throw new ArgumentNullException("connection"); + + if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName"); + + // 如果有参数值 + + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + + // 从缓存中加载存储过程参数 + + SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connection, spName); + + // 给存储过程分配参数值 + + AssignParameterValues(commandParameters, parameterValues); + + return ExecuteNonQuery(connection, CommandType.StoredProcedure, spName, commandParameters); + + } + + else + { + + return ExecuteNonQuery(connection, CommandType.StoredProcedure, spName); + + } + + } + + + + /// + + /// 执行带事务的SqlCommand. + + /// + + /// + + /// 示例.: + + /// int result = ExecuteNonQuery(trans, CommandType.StoredProcedure, "PublishOrders"); + + /// + + /// 一个有效的数据库连接对象 + + /// 命令类型(存储过程,命令文本或其它.) + + /// 存储过程名称或T-SQL语句 + + /// 返回影响的行数/returns> + + public static int ExecuteNonQuery(SqlTransaction transaction, CommandType commandType, string commandText) + { + + return ExecuteNonQuery(transaction, commandType, commandText, (SqlParameter[])null); + + } + + + + /// + + /// 执行带事务的SqlCommand(指定参数). + + /// + + /// + + /// 示例: + + /// int result = ExecuteNonQuery(trans, CommandType.StoredProcedure, "GetOrders", new SqlParameter("@prodid", 24)); + + /// + + /// 一个有效的数据库连接对象 + + /// 命令类型(存储过程,命令文本或其它.) + + /// 存储过程名称或T-SQL语句 + + /// SqlParamter参数数组 + + /// 返回影响的行数 + + public static int ExecuteNonQuery(SqlTransaction transaction, CommandType commandType, string commandText, params SqlParameter[] commandParameters) + { + + if (transaction == null) throw new ArgumentNullException("transaction"); + + if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction"); + + // 预处理 + + SqlCommand cmd = new SqlCommand(); + + bool mustCloseConnection = false; + + PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters, out mustCloseConnection); + + + + // 执行 + + int retval = cmd.ExecuteNonQuery(); + + + + // 清除参数集,以便再次使用. + + cmd.Parameters.Clear(); + + return retval; + + } + + + + /// + + /// 执行带事务的SqlCommand(指定参数值). + + /// + + /// + + /// 此方法不提供访问存储过程输出参数和返回值 + + /// 示例: + + /// int result = ExecuteNonQuery(conn, trans, "PublishOrders", 24, 36); + + /// + + /// 一个有效的数据库连接对象 + + /// 存储过程名 + + /// 分配给存储过程输入参数的对象数组 + + /// 返回受影响的行数 + + public static int ExecuteNonQuery(SqlTransaction transaction, string spName, params object[] parameterValues) + { + + if (transaction == null) throw new ArgumentNullException("transaction"); + + if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction"); + + if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName"); + + // 如果有参数值 + + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + + // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. () + + SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(transaction.Connection, spName); + + // 给存储过程参数赋值 + + AssignParameterValues(commandParameters, parameterValues); + + // 调用重载方法 + + return ExecuteNonQuery(transaction, CommandType.StoredProcedure, spName, commandParameters); + + } + + else + { + + // 没有参数值 + + return ExecuteNonQuery(transaction, CommandType.StoredProcedure, spName); + + } + + } + + #endregion ExecuteNonQuery方法结束 + + #region ExecuteDataset方法 + + /// + + /// 执行指定数据库连接字符串的命令,返回DataSet. + + /// + + /// + + /// 示例: + + /// DataSet ds = ExecuteDataset(connString, CommandType.StoredProcedure, "GetOrders"); + + /// + + /// 一个有效的数据库连接字符串 + + /// 命令类型 (存储过程,命令文本或其它) + + /// 存储过程名称或T-SQL语句 + + /// 返回一个包含结果集的DataSet + + public static DataSet ExecuteDataset(string connectionString, CommandType commandType, string commandText) + { + + return ExecuteDataset(connectionString, commandType, commandText, (SqlParameter[])null); + + } + + + + /// + + /// 执行指定数据库连接字符串的命令,返回DataSet. + + /// + + /// + + /// 示例: + + /// DataSet ds = ExecuteDataset(connString, CommandType.StoredProcedure, "GetOrders", new SqlParameter("@prodid", 24)); + + /// + + /// 一个有效的数据库连接字符串 + + /// 命令类型 (存储过程,命令文本或其它) + + /// 存储过程名称或T-SQL语句 + + /// SqlParamters参数数组 + + /// 返回一个包含结果集的DataSet + + public static DataSet ExecuteDataset(string connectionString, CommandType commandType, string commandText, params SqlParameter[] commandParameters) + { + + if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString"); + + // 创建并打开数据库连接对象,操作完成释放对象. + + using (SqlConnection connection = new SqlConnection(connectionString)) + { + + connection.Open(); + + // 调用指定数据库连接字符串重载方法. + + return ExecuteDataset(connection, commandType, commandText, commandParameters); + + } + + } + + + + /// + + /// 执行指定数据库连接字符串的命令,直接提供参数值,返回DataSet. + + /// + + /// + + /// 此方法不提供访问存储过程输出参数和返回值. + + /// 示例: + + /// DataSet ds = ExecuteDataset(connString, "GetOrders", 24, 36); + + /// + + /// 一个有效的数据库连接字符串 + + /// 存储过程名 + + /// 分配给存储过程输入参数的对象数组 + + /// 返回一个包含结果集的DataSet + + public static DataSet ExecuteDataset(string connectionString, string spName, params object[] parameterValues) + { + + if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString"); + + if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName"); + + + + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + + // 从缓存中检索存储过程参数 + + SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connectionString, spName); + + // 给存储过程参数分配值 + + AssignParameterValues(commandParameters, parameterValues); + + return ExecuteDataset(connectionString, CommandType.StoredProcedure, spName, commandParameters); + + } + + else + { + + return ExecuteDataset(connectionString, CommandType.StoredProcedure, spName); + + } + + } + + + + /// + + /// 执行指定数据库连接对象的命令,返回DataSet. + + /// + + /// + + /// 示例: + + /// DataSet ds = ExecuteDataset(conn, CommandType.StoredProcedure, "GetOrders"); + + /// + + /// 一个有效的数据库连接对象 + + /// 命令类型 (存储过程,命令文本或其它) + + /// 存储过程名或T-SQL语句 + + /// 返回一个包含结果集的DataSet + + public static DataSet ExecuteDataset(SqlConnection connection, CommandType commandType, string commandText) + { + + return ExecuteDataset(connection, commandType, commandText, (SqlParameter[])null); + + } + + + + /// + + /// 执行指定数据库连接对象的命令,指定存储过程参数,返回DataSet. + + /// + + /// + + /// 示例: + + /// DataSet ds = ExecuteDataset(conn, CommandType.StoredProcedure, "GetOrders", new SqlParameter("@prodid", 24)); + + /// + + /// 一个有效的数据库连接对象 + + /// 命令类型 (存储过程,命令文本或其它) + + /// 存储过程名或T-SQL语句 + + /// SqlParamter参数数组 + + /// 返回一个包含结果集的DataSet + + public static DataSet ExecuteDataset(SqlConnection connection, CommandType commandType, string commandText, params SqlParameter[] commandParameters) + { + + if (connection == null) throw new ArgumentNullException("connection"); + + // 预处理 + + SqlCommand cmd = new SqlCommand(); + + bool mustCloseConnection = false; + + PrepareCommand(cmd, connection, (SqlTransaction)null, commandType, commandText, commandParameters, out mustCloseConnection); + + + + // 创建SqlDataAdapter和DataSet. + + using (SqlDataAdapter da = new SqlDataAdapter(cmd)) + { + + DataSet ds = new DataSet(); + + // 填充DataSet. + + da.Fill(ds); + + + + cmd.Parameters.Clear(); + + if (mustCloseConnection) + + connection.Close(); + + return ds; + + } + + } + + + + /// + + /// 执行指定数据库连接对象的命令,指定参数值,返回DataSet. + + /// + + /// + + /// 此方法不提供访问存储过程输入参数和返回值. + + /// 示例.: + + /// DataSet ds = ExecuteDataset(conn, "GetOrders", 24, 36); + + /// + + /// 一个有效的数据库连接对象 + + /// 存储过程名 + + /// 分配给存储过程输入参数的对象数组 + + /// 返回一个包含结果集的DataSet + + public static DataSet ExecuteDataset(SqlConnection connection, string spName, params object[] parameterValues) + { + + if (connection == null) throw new ArgumentNullException("connection"); + + if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName"); + + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + + // 比缓存中加载存储过程参数 + + SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connection, spName); + + // 给存储过程参数分配值 + + AssignParameterValues(commandParameters, parameterValues); + + return ExecuteDataset(connection, CommandType.StoredProcedure, spName, commandParameters); + + } + + else + { + + return ExecuteDataset(connection, CommandType.StoredProcedure, spName); + + } + + } + + + + /// + + /// 执行指定事务的命令,返回DataSet. + + /// + + /// + + /// 示例: + + /// DataSet ds = ExecuteDataset(trans, CommandType.StoredProcedure, "GetOrders"); + + /// + + /// 事务 + + /// 命令类型 (存储过程,命令文本或其它) + + /// 存储过程名或T-SQL语句 + + /// 返回一个包含结果集的DataSet + + public static DataSet ExecuteDataset(SqlTransaction transaction, CommandType commandType, string commandText) + { + + return ExecuteDataset(transaction, commandType, commandText, (SqlParameter[])null); + + } + + + + /// + + /// 执行指定事务的命令,指定参数,返回DataSet. + + /// + + /// + + /// 示例: + + /// DataSet ds = ExecuteDataset(trans, CommandType.StoredProcedure, "GetOrders", new SqlParameter("@prodid", 24)); + + /// + + /// 事务 + + /// 命令类型 (存储过程,命令文本或其它) + + /// 存储过程名或T-SQL语句 + + /// SqlParamter参数数组 + + /// 返回一个包含结果集的DataSet + + public static DataSet ExecuteDataset(SqlTransaction transaction, CommandType commandType, string commandText, params SqlParameter[] commandParameters) + { + + if (transaction == null) throw new ArgumentNullException("transaction"); + + if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction"); + + // 预处理 + + SqlCommand cmd = new SqlCommand(); + + bool mustCloseConnection = false; + + PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters, out mustCloseConnection); + + + + // 创建 DataAdapter & DataSet + + using (SqlDataAdapter da = new SqlDataAdapter(cmd)) + { + + DataSet ds = new DataSet(); + + da.Fill(ds); + + cmd.Parameters.Clear(); + + return ds; + + } + + } + + + + /// + + /// 执行指定事务的命令,指定参数值,返回DataSet. + + /// + + /// + + /// 此方法不提供访问存储过程输入参数和返回值. + + /// 示例.: + + /// DataSet ds = ExecuteDataset(trans, "GetOrders", 24, 36); + + /// + + /// 事务 + + /// 存储过程名 + + /// 分配给存储过程输入参数的对象数组 + + /// 返回一个包含结果集的DataSet + + public static DataSet ExecuteDataset(SqlTransaction transaction, string spName, params object[] parameterValues) + { + + if (transaction == null) throw new ArgumentNullException("transaction"); + + if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction"); + + if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName"); + + + + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + + // 从缓存中加载存储过程参数 + + SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(transaction.Connection, spName); + + // 给存储过程参数分配值 + + AssignParameterValues(commandParameters, parameterValues); + + return ExecuteDataset(transaction, CommandType.StoredProcedure, spName, commandParameters); + + } + + else + { + + return ExecuteDataset(transaction, CommandType.StoredProcedure, spName); + + } + + } + + #endregion ExecuteDataset数据集命令结束 + + #region ExecuteReader 数据阅读器 + + /// + + /// 枚举,标识数据库连接是由SqlHelper提供还是由调用者提供 + + /// + + private enum SqlConnectionOwnership + { + + /// 由SqlHelper提供连接 + + Internal, + + /// 由调用者提供连接 + + External + + } + + + + /// + + /// 执行指定数据库连接对象的数据阅读器. + + /// + + /// + + /// 如果是SqlHelper打开连接,当连接关闭DataReader也将关闭. + + /// 如果是调用都打开连接,DataReader由调用都管理. + + /// + + /// 一个有效的数据库连接对象 + + /// 一个有效的事务,或者为 'null' + + /// 命令类型 (存储过程,命令文本或其它) + + /// 存储过程名或T-SQL语句 + + /// SqlParameters参数数组,如果没有参数则为'null' + + /// 标识数据库连接对象是由调用者提供还是由SqlHelper提供 + + /// 返回包含结果集的SqlDataReader + + private static SqlDataReader ExecuteReader(SqlConnection connection, SqlTransaction transaction, CommandType commandType, string commandText, SqlParameter[] commandParameters, SqlConnectionOwnership connectionOwnership) + { + + if (connection == null) throw new ArgumentNullException("connection"); + + bool mustCloseConnection = false; + + // 创建命令 + + SqlCommand cmd = new SqlCommand(); + + try + { + + PrepareCommand(cmd, connection, transaction, commandType, commandText, commandParameters, out mustCloseConnection); + + + + // 创建数据阅读器 + + SqlDataReader dataReader; + + if (connectionOwnership == SqlConnectionOwnership.External) + { + + dataReader = cmd.ExecuteReader(); + + } + + else + { + + dataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection); + + } + + + + // 清除参数,以便再次使用.. + + // HACK: There is a problem here, the output parameter values are fletched + + // when the reader is closed, so if the parameters are detached from the command + + // then the SqlReader can磘 set its values. + + // When this happen, the parameters can磘 be used again in other command. + + bool canClear = true; + + foreach (SqlParameter commandParameter in cmd.Parameters) + { + + if (commandParameter.Direction != ParameterDirection.Input) + + canClear = false; + + } + + + + if (canClear) + { + + cmd.Parameters.Clear(); + + } + + return dataReader; + + } + + catch + { + + if (mustCloseConnection) + + connection.Close(); + + throw; + + } + + } + + + + /// + + /// 执行指定数据库连接字符串的数据阅读器. + + /// + + /// + + /// 示例: + + /// SqlDataReader dr = ExecuteReader(connString, CommandType.StoredProcedure, "GetOrders"); + + /// + + /// 一个有效的数据库连接字符串 + + /// 命令类型 (存储过程,命令文本或其它) + + /// 存储过程名或T-SQL语句 + + /// 返回包含结果集的SqlDataReader + + public static SqlDataReader ExecuteReader(string connectionString, CommandType commandType, string commandText) + { + + return ExecuteReader(connectionString, commandType, commandText, (SqlParameter[])null); + + } + + + + /// + + /// 执行指定数据库连接字符串的数据阅读器,指定参数. + + /// + + /// + + /// 示例: + + /// SqlDataReader dr = ExecuteReader(connString, CommandType.StoredProcedure, "GetOrders", new SqlParameter("@prodid", 24)); + + /// + + /// 一个有效的数据库连接字符串 + + /// 命令类型 (存储过程,命令文本或其它) + + /// 存储过程名或T-SQL语句 + + /// SqlParamter参数数组(new SqlParameter("@prodid", 24)) + + /// 返回包含结果集的SqlDataReader + + public static SqlDataReader ExecuteReader(string connectionString, CommandType commandType, string commandText, params SqlParameter[] commandParameters) + { + + if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString"); + + SqlConnection connection = null; + + try + { + + connection = new SqlConnection(connectionString); + + connection.Open(); + + return ExecuteReader(connection, null, commandType, commandText, commandParameters, SqlConnectionOwnership.Internal); + + } + + catch + { + + // If we fail to return the SqlDatReader, we need to close the connection ourselves + + if (connection != null) connection.Close(); + + throw; + + } + + + + } + + + + /// + + /// 执行指定数据库连接字符串的数据阅读器,指定参数值. + + /// + + /// + + /// 此方法不提供访问存储过程输出参数和返回值参数. + + /// 示例: + + /// SqlDataReader dr = ExecuteReader(connString, "GetOrders", 24, 36); + + /// + + /// 一个有效的数据库连接字符串 + + /// 存储过程名 + + /// 分配给存储过程输入参数的对象数组 + + /// 返回包含结果集的SqlDataReader + + public static SqlDataReader ExecuteReader(string connectionString, string spName, params object[] parameterValues) + { + + if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString"); + + if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName"); + + + + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + + SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connectionString, spName); + + AssignParameterValues(commandParameters, parameterValues); + + return ExecuteReader(connectionString, CommandType.StoredProcedure, spName, commandParameters); + + } + + else + { + + return ExecuteReader(connectionString, CommandType.StoredProcedure, spName); + + } + + } + + + + /// + + /// 执行指定数据库连接对象的数据阅读器. + + /// + + /// + + /// 示例: + + /// SqlDataReader dr = ExecuteReader(conn, CommandType.StoredProcedure, "GetOrders"); + + /// + + /// 一个有效的数据库连接对象 + + /// 命令类型 (存储过程,命令文本或其它) + + /// 存储过程名或T-SQL语句 + + /// 返回包含结果集的SqlDataReader + + public static SqlDataReader ExecuteReader(SqlConnection connection, CommandType commandType, string commandText) + { + + return ExecuteReader(connection, commandType, commandText, (SqlParameter[])null); + + } + + + + /// + + /// [调用者方式]执行指定数据库连接对象的数据阅读器,指定参数. + + /// + + /// + + /// 示例: + + /// SqlDataReader dr = ExecuteReader(conn, CommandType.StoredProcedure, "GetOrders", new SqlParameter("@prodid", 24)); + + /// + + /// 一个有效的数据库连接对象 + + /// 命令类型 (存储过程,命令文本或其它) + + /// 命令类型 (存储过程,命令文本或其它) + + /// SqlParamter参数数组 + + /// 返回包含结果集的SqlDataReader + + public static SqlDataReader ExecuteReader(SqlConnection connection, CommandType commandType, string commandText, params SqlParameter[] commandParameters) + { + + return ExecuteReader(connection, (SqlTransaction)null, commandType, commandText, commandParameters, SqlConnectionOwnership.External); + + } + + + + /// + + /// [调用者方式]执行指定数据库连接对象的数据阅读器,指定参数值. + + /// + + /// + + /// 此方法不提供访问存储过程输出参数和返回值参数. + + /// 示例: + + /// SqlDataReader dr = ExecuteReader(conn, "GetOrders", 24, 36); + + /// + + /// 一个有效的数据库连接对象 + + /// T存储过程名 + + /// 分配给存储过程输入参数的对象数组 + + /// 返回包含结果集的SqlDataReader + + public static SqlDataReader ExecuteReader(SqlConnection connection, string spName, params object[] parameterValues) + { + + if (connection == null) throw new ArgumentNullException("connection"); + + if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName"); + + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + + SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connection, spName); + + AssignParameterValues(commandParameters, parameterValues); + + return ExecuteReader(connection, CommandType.StoredProcedure, spName, commandParameters); + + } + + else + { + + return ExecuteReader(connection, CommandType.StoredProcedure, spName); + + } + + } + + + + /// + + /// [调用者方式]执行指定数据库事务的数据阅读器,指定参数值. + + /// + + /// + + /// 示例: + + /// SqlDataReader dr = ExecuteReader(trans, CommandType.StoredProcedure, "GetOrders"); + + /// + + /// 一个有效的连接事务 + + /// 命令类型 (存储过程,命令文本或其它) + + /// 存储过程名称或T-SQL语句 + + /// 返回包含结果集的SqlDataReader + + public static SqlDataReader ExecuteReader(SqlTransaction transaction, CommandType commandType, string commandText) + { + + return ExecuteReader(transaction, commandType, commandText, (SqlParameter[])null); + + } + + + + /// + + /// [调用者方式]执行指定数据库事务的数据阅读器,指定参数. + + /// + + /// + + /// 示例: + + /// SqlDataReader dr = ExecuteReader(trans, CommandType.StoredProcedure, "GetOrders", new SqlParameter("@prodid", 24)); + + /// + + /// 一个有效的连接事务 + + /// 命令类型 (存储过程,命令文本或其它) + + /// 存储过程名称或T-SQL语句 + + /// 分配给命令的SqlParamter参数数组 + + /// 返回包含结果集的SqlDataReader + + public static SqlDataReader ExecuteReader(SqlTransaction transaction, CommandType commandType, string commandText, params SqlParameter[] commandParameters) + { + + if (transaction == null) throw new ArgumentNullException("transaction"); + + if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction"); + + return ExecuteReader(transaction.Connection, transaction, commandType, commandText, commandParameters, SqlConnectionOwnership.External); + + } + + + + /// + + /// [调用者方式]执行指定数据库事务的数据阅读器,指定参数值. + + /// + + /// + + /// 此方法不提供访问存储过程输出参数和返回值参数. + + /// + + /// 示例: + + /// SqlDataReader dr = ExecuteReader(trans, "GetOrders", 24, 36); + + /// + + /// 一个有效的连接事务 + + /// 存储过程名称 + + /// 分配给存储过程输入参数的对象数组 + + /// 返回包含结果集的SqlDataReader + + public static SqlDataReader ExecuteReader(SqlTransaction transaction, string spName, params object[] parameterValues) + { + + if (transaction == null) throw new ArgumentNullException("transaction"); + + if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction"); + + if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName"); + + // 如果有参数值 + + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + + SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(transaction.Connection, spName); + + AssignParameterValues(commandParameters, parameterValues); + + return ExecuteReader(transaction, CommandType.StoredProcedure, spName, commandParameters); + + } + + else + { + + // 没有参数值 + + return ExecuteReader(transaction, CommandType.StoredProcedure, spName); + + } + + } + + #endregion ExecuteReader数据阅读器 + + #region ExecuteScalar 返回结果集中的第一行第一列 + + /// + + /// 执行指定数据库连接字符串的命令,返回结果集中的第一行第一列. + + /// + + /// + + /// 示例: + + /// int orderCount = (int)ExecuteScalar(connString, CommandType.StoredProcedure, "GetOrderCount"); + + /// + + /// 一个有效的数据库连接字符串 + + /// 命令类型 (存储过程,命令文本或其它) + + /// 存储过程名称或T-SQL语句 + + /// 返回结果集中的第一行第一列 + + public static object ExecuteScalar(string connectionString, CommandType commandType, string commandText) + { + + // 执行参数为空的方法 + + return ExecuteScalar(connectionString, commandType, commandText, (SqlParameter[])null); + + } + + + + /// + + /// 执行指定数据库连接字符串的命令,指定参数,返回结果集中的第一行第一列. + + /// + + /// + + /// 示例: + + /// int orderCount = (int)ExecuteScalar(connString, CommandType.StoredProcedure, "GetOrderCount", new SqlParameter("@prodid", 24)); + + /// + + /// 一个有效的数据库连接字符串 + + /// 命令类型 (存储过程,命令文本或其它) + + /// 存储过程名称或T-SQL语句 + + /// 分配给命令的SqlParamter参数数组 + + /// 返回结果集中的第一行第一列 + + public static object ExecuteScalar(string connectionString, CommandType commandType, string commandText, params SqlParameter[] commandParameters) + { + + if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString"); + + // 创建并打开数据库连接对象,操作完成释放对象. + + using (SqlConnection connection = new SqlConnection(connectionString)) + { + + connection.Open(); + + // 调用指定数据库连接字符串重载方法. + + return ExecuteScalar(connection, commandType, commandText, commandParameters); + + } + + } + + + + /// + + /// 执行指定数据库连接字符串的命令,指定参数值,返回结果集中的第一行第一列. + + /// + + /// + + /// 此方法不提供访问存储过程输出参数和返回值参数. + + /// + + /// 示例: + + /// int orderCount = (int)ExecuteScalar(connString, "GetOrderCount", 24, 36); + + /// + + /// 一个有效的数据库连接字符串 + + /// 存储过程名称 + + /// 分配给存储过程输入参数的对象数组 + + /// 返回结果集中的第一行第一列 + + public static object ExecuteScalar(string connectionString, string spName, params object[] parameterValues) + { + + if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString"); + + if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName"); + + + + // 如果有参数值 + + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + + // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. () + + SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connectionString, spName); + + // 给存储过程参数赋值 + + AssignParameterValues(commandParameters, parameterValues); + + // 调用重载方法 + + return ExecuteScalar(connectionString, CommandType.StoredProcedure, spName, commandParameters); + + } + + else + { + + // 没有参数值 + + return ExecuteScalar(connectionString, CommandType.StoredProcedure, spName); + + } + + } + + + + /// + + /// 执行指定数据库连接对象的命令,返回结果集中的第一行第一列. + + /// + + /// + + /// 示例: + + /// int orderCount = (int)ExecuteScalar(conn, CommandType.StoredProcedure, "GetOrderCount"); + + /// + + /// 一个有效的数据库连接对象 + + /// 命令类型 (存储过程,命令文本或其它) + + /// 存储过程名称或T-SQL语句 + + /// 返回结果集中的第一行第一列 + + public static object ExecuteScalar(SqlConnection connection, CommandType commandType, string commandText) + { + + // 执行参数为空的方法 + + return ExecuteScalar(connection, commandType, commandText, (SqlParameter[])null); + + } + + + + /// + + /// 执行指定数据库连接对象的命令,指定参数,返回结果集中的第一行第一列. + + /// + + /// + + /// 示例: + + /// int orderCount = (int)ExecuteScalar(conn, CommandType.StoredProcedure, "GetOrderCount", new SqlParameter("@prodid", 24)); + + /// + + /// 一个有效的数据库连接对象 + + /// 命令类型 (存储过程,命令文本或其它) + + /// 存储过程名称或T-SQL语句 + + /// 分配给命令的SqlParamter参数数组 + + /// 返回结果集中的第一行第一列 + + public static object ExecuteScalar(SqlConnection connection, CommandType commandType, string commandText, params SqlParameter[] commandParameters) + { + + if (connection == null) throw new ArgumentNullException("connection"); + + // 创建SqlCommand命令,并进行预处理 + + SqlCommand cmd = new SqlCommand(); + + bool mustCloseConnection = false; + + PrepareCommand(cmd, connection, (SqlTransaction)null, commandType, commandText, commandParameters, out mustCloseConnection); + + + + // 执行SqlCommand命令,并返回结果. + + object retval = cmd.ExecuteScalar(); + + + + // 清除参数,以便再次使用. + + cmd.Parameters.Clear(); + + if (mustCloseConnection) + + connection.Close(); + + return retval; + + } + + + + /// + + /// 执行指定数据库连接对象的命令,指定参数值,返回结果集中的第一行第一列. + + /// + + /// + + /// 此方法不提供访问存储过程输出参数和返回值参数. + + /// + + /// 示例: + + /// int orderCount = (int)ExecuteScalar(conn, "GetOrderCount", 24, 36); + + /// + + /// 一个有效的数据库连接对象 + + /// 存储过程名称 + + /// 分配给存储过程输入参数的对象数组 + + /// 返回结果集中的第一行第一列 + + public static object ExecuteScalar(SqlConnection connection, string spName, params object[] parameterValues) + { + + if (connection == null) throw new ArgumentNullException("connection"); + + if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName"); + + // 如果有参数值 + + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + + // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. () + + SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connection, spName); + + // 给存储过程参数赋值 + + AssignParameterValues(commandParameters, parameterValues); + + // 调用重载方法 + + return ExecuteScalar(connection, CommandType.StoredProcedure, spName, commandParameters); + + } + + else + { + + // 没有参数值 + + return ExecuteScalar(connection, CommandType.StoredProcedure, spName); + + } + + } + + + + /// + + /// 执行指定数据库事务的命令,返回结果集中的第一行第一列. + + /// + + /// + + /// 示例: + + /// int orderCount = (int)ExecuteScalar(trans, CommandType.StoredProcedure, "GetOrderCount"); + + /// + + /// 一个有效的连接事务 + + /// 命令类型 (存储过程,命令文本或其它) + + /// 存储过程名称或T-SQL语句 + + /// 返回结果集中的第一行第一列 + + public static object ExecuteScalar(SqlTransaction transaction, CommandType commandType, string commandText) + { + + // 执行参数为空的方法 + + return ExecuteScalar(transaction, commandType, commandText, (SqlParameter[])null); + + } + + + + /// + + /// 执行指定数据库事务的命令,指定参数,返回结果集中的第一行第一列. + + /// + + /// + + /// 示例: + + /// int orderCount = (int)ExecuteScalar(trans, CommandType.StoredProcedure, "GetOrderCount", new SqlParameter("@prodid", 24)); + + /// + + /// 一个有效的连接事务 + + /// 命令类型 (存储过程,命令文本或其它) + + /// 存储过程名称或T-SQL语句 + + /// 分配给命令的SqlParamter参数数组 + + /// 返回结果集中的第一行第一列 + + public static object ExecuteScalar(SqlTransaction transaction, CommandType commandType, string commandText, params SqlParameter[] commandParameters) + { + + if (transaction == null) throw new ArgumentNullException("transaction"); + + if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction"); + + // 创建SqlCommand命令,并进行预处理 + + SqlCommand cmd = new SqlCommand(); + + bool mustCloseConnection = false; + + PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters, out mustCloseConnection); + + + + // 执行SqlCommand命令,并返回结果. + + object retval = cmd.ExecuteScalar(); + + + + // 清除参数,以便再次使用. + + cmd.Parameters.Clear(); + + return retval; + + } + + + + /// + + /// 执行指定数据库事务的命令,指定参数值,返回结果集中的第一行第一列. + + /// + + /// + + /// 此方法不提供访问存储过程输出参数和返回值参数. + + /// + + /// 示例: + + /// int orderCount = (int)ExecuteScalar(trans, "GetOrderCount", 24, 36); + + /// + + /// 一个有效的连接事务 + + /// 存储过程名称 + + /// 分配给存储过程输入参数的对象数组 + + /// 返回结果集中的第一行第一列 + + public static object ExecuteScalar(SqlTransaction transaction, string spName, params object[] parameterValues) + { + + if (transaction == null) throw new ArgumentNullException("transaction"); + + if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction"); + + if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName"); + + // 如果有参数值 + + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + + // PPull the parameters for this stored procedure from the parameter cache () + + SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(transaction.Connection, spName); + + // 给存储过程参数赋值 + + AssignParameterValues(commandParameters, parameterValues); + + // 调用重载方法 + + return ExecuteScalar(transaction, CommandType.StoredProcedure, spName, commandParameters); + + } + + else + { + + // 没有参数值 + + return ExecuteScalar(transaction, CommandType.StoredProcedure, spName); + + } + + } + + #endregion ExecuteScalar + + #region ExecuteXmlReader XML阅读器 + + /// + + /// 执行指定数据库连接对象的SqlCommand命令,并产生一个XmlReader对象做为结果集返回. + + /// + + /// + + /// 示例: + + /// XmlReader r = ExecuteXmlReader(conn, CommandType.StoredProcedure, "GetOrders"); + + /// + + /// 一个有效的数据库连接对象 + + /// 命令类型 (存储过程,命令文本或其它) + + /// 存储过程名称或T-SQL语句 using "FOR XML AUTO" + + /// 返回XmlReader结果集对象. + + public static XmlReader ExecuteXmlReader(SqlConnection connection, CommandType commandType, string commandText) + { + + // 执行参数为空的方法 + + return ExecuteXmlReader(connection, commandType, commandText, (SqlParameter[])null); + + } + + + + /// + + /// 执行指定数据库连接对象的SqlCommand命令,并产生一个XmlReader对象做为结果集返回,指定参数. + + /// + + /// + + /// 示例: + + /// XmlReader r = ExecuteXmlReader(conn, CommandType.StoredProcedure, "GetOrders", new SqlParameter("@prodid", 24)); + + /// + + /// 一个有效的数据库连接对象 + + /// 命令类型 (存储过程,命令文本或其它) + + /// 存储过程名称或T-SQL语句 using "FOR XML AUTO" + + /// 分配给命令的SqlParamter参数数组 + + /// 返回XmlReader结果集对象. + + public static XmlReader ExecuteXmlReader(SqlConnection connection, CommandType commandType, string commandText, params SqlParameter[] commandParameters) + { + + if (connection == null) throw new ArgumentNullException("connection"); + + bool mustCloseConnection = false; + + // 创建SqlCommand命令,并进行预处理 + + SqlCommand cmd = new SqlCommand(); + + try + { + + PrepareCommand(cmd, connection, (SqlTransaction)null, commandType, commandText, commandParameters, out mustCloseConnection); + + + + // 执行命令 + + XmlReader retval = cmd.ExecuteXmlReader(); + + + + // 清除参数,以便再次使用. + + cmd.Parameters.Clear(); + + return retval; + + } + + catch + { + + if (mustCloseConnection) + + connection.Close(); + + throw; + + } + + } + + + + /// + + /// 执行指定数据库连接对象的SqlCommand命令,并产生一个XmlReader对象做为结果集返回,指定参数值. + + /// + + /// + + /// 此方法不提供访问存储过程输出参数和返回值参数. + + /// + + /// 示例: + + /// XmlReader r = ExecuteXmlReader(conn, "GetOrders", 24, 36); + + /// + + /// 一个有效的数据库连接对象 + + /// 存储过程名称 using "FOR XML AUTO" + + /// 分配给存储过程输入参数的对象数组 + + /// 返回XmlReader结果集对象. + + public static XmlReader ExecuteXmlReader(SqlConnection connection, string spName, params object[] parameterValues) + { + + if (connection == null) throw new ArgumentNullException("connection"); + + if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName"); + + // 如果有参数值 + + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + + // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. () + + SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connection, spName); + + // 给存储过程参数赋值 + + AssignParameterValues(commandParameters, parameterValues); + + // 调用重载方法 + + return ExecuteXmlReader(connection, CommandType.StoredProcedure, spName, commandParameters); + + } + + else + { + + // 没有参数值 + + return ExecuteXmlReader(connection, CommandType.StoredProcedure, spName); + + } + + } + + + + /// + + /// 执行指定数据库事务的SqlCommand命令,并产生一个XmlReader对象做为结果集返回. + + /// + + /// + + /// 示例: + + /// XmlReader r = ExecuteXmlReader(trans, CommandType.StoredProcedure, "GetOrders"); + + /// + + /// 一个有效的连接事务 + + /// 命令类型 (存储过程,命令文本或其它) + + /// 存储过程名称或T-SQL语句 using "FOR XML AUTO" + + /// 返回XmlReader结果集对象. + + public static XmlReader ExecuteXmlReader(SqlTransaction transaction, CommandType commandType, string commandText) + { + + // 执行参数为空的方法 + + return ExecuteXmlReader(transaction, commandType, commandText, (SqlParameter[])null); + + } + + + + /// + + /// 执行指定数据库事务的SqlCommand命令,并产生一个XmlReader对象做为结果集返回,指定参数. + + /// + + /// + + /// 示例: + + /// XmlReader r = ExecuteXmlReader(trans, CommandType.StoredProcedure, "GetOrders", new SqlParameter("@prodid", 24)); + + /// + + /// 一个有效的连接事务 + + /// 命令类型 (存储过程,命令文本或其它) + + /// 存储过程名称或T-SQL语句 using "FOR XML AUTO" + + /// 分配给命令的SqlParamter参数数组 + + /// 返回XmlReader结果集对象. + + public static XmlReader ExecuteXmlReader(SqlTransaction transaction, CommandType commandType, string commandText, params SqlParameter[] commandParameters) + { + + if (transaction == null) throw new ArgumentNullException("transaction"); + + if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction"); + + // 创建SqlCommand命令,并进行预处理 + + SqlCommand cmd = new SqlCommand(); + + bool mustCloseConnection = false; + + PrepareCommand(cmd, transaction.Connection, transaction, commandType, commandText, commandParameters, out mustCloseConnection); + + + + // 执行命令 + + XmlReader retval = cmd.ExecuteXmlReader(); + + + + // 清除参数,以便再次使用. + + cmd.Parameters.Clear(); + + return retval; + + } + + + + /// + + /// 执行指定数据库事务的SqlCommand命令,并产生一个XmlReader对象做为结果集返回,指定参数值. + + /// + + /// + + /// 此方法不提供访问存储过程输出参数和返回值参数. + + /// + + /// 示例: + + /// XmlReader r = ExecuteXmlReader(trans, "GetOrders", 24, 36); + + /// + + /// 一个有效的连接事务 + + /// 存储过程名称 + + /// 分配给存储过程输入参数的对象数组 + + /// 返回一个包含结果集的DataSet. + + public static XmlReader ExecuteXmlReader(SqlTransaction transaction, string spName, params object[] parameterValues) + { + + if (transaction == null) throw new ArgumentNullException("transaction"); + + if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction"); + + if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName"); + + // 如果有参数值 + + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + + // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. () + + SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(transaction.Connection, spName); + + // 给存储过程参数赋值 + + AssignParameterValues(commandParameters, parameterValues); + + // 调用重载方法 + + return ExecuteXmlReader(transaction, CommandType.StoredProcedure, spName, commandParameters); + + } + + else + { + + // 没有参数值 + + return ExecuteXmlReader(transaction, CommandType.StoredProcedure, spName); + + } + + } + + #endregion ExecuteXmlReader 阅读器结束 + + #region FillDataset 填充数据集 + + /// + + /// 执行指定数据库连接字符串的命令,映射数据表并填充数据集. + + /// + + /// + + /// 示例: + + /// FillDataset(connString, CommandType.StoredProcedure, "GetOrders", ds, new string[] {"orders"}); + + /// + + /// 一个有效的数据库连接字符串 + + /// 命令类型 (存储过程,命令文本或其它) + + /// 存储过程名称或T-SQL语句 + + /// 要填充结果集的DataSet实例 + + /// 表映射的数据表数组 + + /// 用户定义的表名 (可有是实际的表名.) + + public static void FillDataset(string connectionString, CommandType commandType, string commandText, DataSet dataSet, string[] tableNames) + { + + if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString"); + + if (dataSet == null) throw new ArgumentNullException("dataSet"); + + + + // 创建并打开数据库连接对象,操作完成释放对象. + + using (SqlConnection connection = new SqlConnection(connectionString)) + { + + connection.Open(); + + // 调用指定数据库连接字符串重载方法. + + FillDataset(connection, commandType, commandText, dataSet, tableNames); + + } + + } + + + + /// + + /// 执行指定数据库连接字符串的命令,映射数据表并填充数据集.指定命令参数. + + /// + + /// + + /// 示例: + + /// FillDataset(connString, CommandType.StoredProcedure, "GetOrders", ds, new string[] {"orders"}, new SqlParameter("@prodid", 24)); + + /// + + /// 一个有效的数据库连接字符串 + + /// 命令类型 (存储过程,命令文本或其它) + + /// 存储过程名称或T-SQL语句 + + /// 分配给命令的SqlParamter参数数组 + + /// 要填充结果集的DataSet实例 + + /// 表映射的数据表数组 + + /// 用户定义的表名 (可有是实际的表名.) + + /// + + public static void FillDataset(string connectionString, CommandType commandType, + + string commandText, DataSet dataSet, string[] tableNames, + + params SqlParameter[] commandParameters) + { + + if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString"); + + if (dataSet == null) throw new ArgumentNullException("dataSet"); + + // 创建并打开数据库连接对象,操作完成释放对象. + + using (SqlConnection connection = new SqlConnection(connectionString)) + { + + connection.Open(); + + // 调用指定数据库连接字符串重载方法. + + FillDataset(connection, commandType, commandText, dataSet, tableNames, commandParameters); + + } + + } + + + + /// + + /// 执行指定数据库连接字符串的命令,映射数据表并填充数据集,指定存储过程参数值. + + /// + + /// + + /// 此方法不提供访问存储过程输出参数和返回值参数. + + /// + + /// 示例: + + /// FillDataset(connString, CommandType.StoredProcedure, "GetOrders", ds, new string[] {"orders"}, 24); + + /// + + /// 一个有效的数据库连接字符串 + + /// 存储过程名称 + + /// 要填充结果集的DataSet实例 + + /// 表映射的数据表数组 + + /// 用户定义的表名 (可有是实际的表名.) + + /// + + /// 分配给存储过程输入参数的对象数组 + + public static void FillDataset(string connectionString, string spName, + + DataSet dataSet, string[] tableNames, + + params object[] parameterValues) + { + + if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString"); + + if (dataSet == null) throw new ArgumentNullException("dataSet"); + + // 创建并打开数据库连接对象,操作完成释放对象. + + using (SqlConnection connection = new SqlConnection(connectionString)) + { + + connection.Open(); + + // 调用指定数据库连接字符串重载方法. + + FillDataset(connection, spName, dataSet, tableNames, parameterValues); + + } + + } + + + + /// + + /// 执行指定数据库连接对象的命令,映射数据表并填充数据集. + + /// + + /// + + /// 示例: + + /// FillDataset(conn, CommandType.StoredProcedure, "GetOrders", ds, new string[] {"orders"}); + + /// + + /// 一个有效的数据库连接对象 + + /// 命令类型 (存储过程,命令文本或其它) + + /// 存储过程名称或T-SQL语句 + + /// 要填充结果集的DataSet实例 + + /// 表映射的数据表数组 + + /// 用户定义的表名 (可有是实际的表名.) + + /// + + public static void FillDataset(SqlConnection connection, CommandType commandType, + + string commandText, DataSet dataSet, string[] tableNames) + { + + FillDataset(connection, commandType, commandText, dataSet, tableNames, null); + + } + + + + /// + + /// 执行指定数据库连接对象的命令,映射数据表并填充数据集,指定参数. + + /// + + /// + + /// 示例: + + /// FillDataset(conn, CommandType.StoredProcedure, "GetOrders", ds, new string[] {"orders"}, new SqlParameter("@prodid", 24)); + + /// + + /// 一个有效的数据库连接对象 + + /// 命令类型 (存储过程,命令文本或其它) + + /// 存储过程名称或T-SQL语句 + + /// 要填充结果集的DataSet实例 + + /// 表映射的数据表数组 + + /// 用户定义的表名 (可有是实际的表名.) + + /// + + /// 分配给命令的SqlParamter参数数组 + + public static void FillDataset(SqlConnection connection, CommandType commandType, + + string commandText, DataSet dataSet, string[] tableNames, + + params SqlParameter[] commandParameters) + { + + FillDataset(connection, null, commandType, commandText, dataSet, tableNames, commandParameters); + + } + + + + /// + + /// 执行指定数据库连接对象的命令,映射数据表并填充数据集,指定存储过程参数值. + + /// + + /// + + /// 此方法不提供访问存储过程输出参数和返回值参数. + + /// + + /// 示例: + + /// FillDataset(conn, "GetOrders", ds, new string[] {"orders"}, 24, 36); + + /// + + /// 一个有效的数据库连接对象 + + /// 存储过程名称 + + /// 要填充结果集的DataSet实例 + + /// 表映射的数据表数组 + + /// 用户定义的表名 (可有是实际的表名.) + + /// + + /// 分配给存储过程输入参数的对象数组 + + public static void FillDataset(SqlConnection connection, string spName, + + DataSet dataSet, string[] tableNames, + + params object[] parameterValues) + { + + if (connection == null) throw new ArgumentNullException("connection"); + + if (dataSet == null) throw new ArgumentNullException("dataSet"); + + if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName"); + + // 如果有参数值 + + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + + // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. () + + SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connection, spName); + + // 给存储过程参数赋值 + + AssignParameterValues(commandParameters, parameterValues); + + // 调用重载方法 + + FillDataset(connection, CommandType.StoredProcedure, spName, dataSet, tableNames, commandParameters); + + } + + else + { + + // 没有参数值 + + FillDataset(connection, CommandType.StoredProcedure, spName, dataSet, tableNames); + + } + + } + + + + /// + + /// 执行指定数据库事务的命令,映射数据表并填充数据集. + + /// + + /// + + /// 示例: + + /// FillDataset(trans, CommandType.StoredProcedure, "GetOrders", ds, new string[] {"orders"}); + + /// + + /// 一个有效的连接事务 + + /// 命令类型 (存储过程,命令文本或其它) + + /// 存储过程名称或T-SQL语句 + + /// 要填充结果集的DataSet实例 + + /// 表映射的数据表数组 + + /// 用户定义的表名 (可有是实际的表名.) + + /// + + public static void FillDataset(SqlTransaction transaction, CommandType commandType, + + string commandText, + + DataSet dataSet, string[] tableNames) + { + + FillDataset(transaction, commandType, commandText, dataSet, tableNames, null); + + } + + + + /// + + /// 执行指定数据库事务的命令,映射数据表并填充数据集,指定参数. + + /// + + /// + + /// 示例: + + /// FillDataset(trans, CommandType.StoredProcedure, "GetOrders", ds, new string[] {"orders"}, new SqlParameter("@prodid", 24)); + + /// + + /// 一个有效的连接事务 + + /// 命令类型 (存储过程,命令文本或其它) + + /// 存储过程名称或T-SQL语句 + + /// 要填充结果集的DataSet实例 + + /// 表映射的数据表数组 + + /// 用户定义的表名 (可有是实际的表名.) + + /// + + /// 分配给命令的SqlParamter参数数组 + + public static void FillDataset(SqlTransaction transaction, CommandType commandType, + + string commandText, DataSet dataSet, string[] tableNames, + + params SqlParameter[] commandParameters) + { + + FillDataset(transaction.Connection, transaction, commandType, commandText, dataSet, tableNames, commandParameters); + + } + + + + /// + + /// 执行指定数据库事务的命令,映射数据表并填充数据集,指定存储过程参数值. + + /// + + /// + + /// 此方法不提供访问存储过程输出参数和返回值参数. + + /// + + /// 示例: + + /// FillDataset(trans, "GetOrders", ds, new string[]{"orders"}, 24, 36); + + /// + + /// 一个有效的连接事务 + + /// 存储过程名称 + + /// 要填充结果集的DataSet实例 + + /// 表映射的数据表数组 + + /// 用户定义的表名 (可有是实际的表名.) + + /// + + /// 分配给存储过程输入参数的对象数组 + + public static void FillDataset(SqlTransaction transaction, string spName, + + DataSet dataSet, string[] tableNames, + + params object[] parameterValues) + { + + if (transaction == null) throw new ArgumentNullException("transaction"); + + if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction"); + + if (dataSet == null) throw new ArgumentNullException("dataSet"); + + if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName"); + + // 如果有参数值 + + if ((parameterValues != null) && (parameterValues.Length > 0)) + { + + // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. () + + SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(transaction.Connection, spName); + + // 给存储过程参数赋值 + + AssignParameterValues(commandParameters, parameterValues); + + // 调用重载方法 + + FillDataset(transaction, CommandType.StoredProcedure, spName, dataSet, tableNames, commandParameters); + + } + + else + { + + // 没有参数值 + + FillDataset(transaction, CommandType.StoredProcedure, spName, dataSet, tableNames); + + } + + } + + + + /// + + /// [私有方法][内部调用]执行指定数据库连接对象/事务的命令,映射数据表并填充数据集,DataSet/TableNames/SqlParameters. + + /// + + /// + + /// 示例: + + /// FillDataset(conn, trans, CommandType.StoredProcedure, "GetOrders", ds, new string[] {"orders"}, new SqlParameter("@prodid", 24)); + + /// + + /// 一个有效的数据库连接对象 + + /// 一个有效的连接事务 + + /// 命令类型 (存储过程,命令文本或其它) + + /// 存储过程名称或T-SQL语句 + + /// 要填充结果集的DataSet实例 + + /// 表映射的数据表数组 + + /// 用户定义的表名 (可有是实际的表名.) + + /// + + /// 分配给命令的SqlParamter参数数组 + + private static void FillDataset(SqlConnection connection, SqlTransaction transaction, CommandType commandType, + + string commandText, DataSet dataSet, string[] tableNames, + + params SqlParameter[] commandParameters) + { + + if (connection == null) throw new ArgumentNullException("connection"); + + if (dataSet == null) throw new ArgumentNullException("dataSet"); + + // 创建SqlCommand命令,并进行预处理 + + SqlCommand command = new SqlCommand(); + + bool mustCloseConnection = false; + + PrepareCommand(command, connection, transaction, commandType, commandText, commandParameters, out mustCloseConnection); + + + + // 执行命令 + + using (SqlDataAdapter dataAdapter = new SqlDataAdapter(command)) + { + + + + // 追加表映射 + + if (tableNames != null && tableNames.Length > 0) + { + + string tableName = "Table"; + + for (int index = 0; index < tableNames.Length; index++) + { + + if (tableNames[index] == null || tableNames[index].Length == 0) throw new ArgumentException("The tableNames parameter must contain a list of tables, a value was provided as null or empty string.", "tableNames"); + + dataAdapter.TableMappings.Add(tableName, tableNames[index]); + + tableName += (index + 1).ToString(); + + } + + } + + + + // 填充数据集使用默认表名称 + + dataAdapter.Fill(dataSet); + + // 清除参数,以便再次使用. + + command.Parameters.Clear(); + + } + + if (mustCloseConnection) + + connection.Close(); + + } + + #endregion + + #region UpdateDataset 更新数据集 + + /// + + /// 执行数据集更新到数据库,指定inserted, updated, or deleted命令. + + /// + + /// + + /// 示例: + + /// UpdateDataset(conn, insertCommand, deleteCommand, updateCommand, dataSet, "Order"); + + /// + + /// [追加记录]一个有效的T-SQL语句或存储过程 + + /// [删除记录]一个有效的T-SQL语句或存储过程 + + /// [更新记录]一个有效的T-SQL语句或存储过程 + + /// 要更新到数据库的DataSet + + /// 要更新到数据库的DataTable + + public static void UpdateDataset(SqlCommand insertCommand, SqlCommand deleteCommand, SqlCommand updateCommand, DataSet dataSet, string tableName) + { + + if (insertCommand == null) throw new ArgumentNullException("insertCommand"); + + if (deleteCommand == null) throw new ArgumentNullException("deleteCommand"); + + if (updateCommand == null) throw new ArgumentNullException("updateCommand"); + + if (tableName == null || tableName.Length == 0) throw new ArgumentNullException("tableName"); + + // 创建SqlDataAdapter,当操作完成后释放. + + using (SqlDataAdapter dataAdapter = new SqlDataAdapter()) + { + + // 设置数据适配器命令 + + dataAdapter.UpdateCommand = updateCommand; + + dataAdapter.InsertCommand = insertCommand; + + dataAdapter.DeleteCommand = deleteCommand; + + // 更新数据集改变到数据库 + + dataAdapter.Update(dataSet, tableName); + + // 提交所有改变到数据集. + + dataSet.AcceptChanges(); + + } + + } + + #endregion + + #region CreateCommand 创建一条SqlCommand命令 + + /// + + /// 创建SqlCommand命令,指定数据库连接对象,存储过程名和参数. + + /// + + /// + + /// 示例: + + /// SqlCommand command = CreateCommand(conn, "AddCustomer", "CustomerID", "CustomerName"); + + /// + + /// 一个有效的数据库连接对象 + + /// 存储过程名称 + + /// 源表的列名称数组 + + /// 返回SqlCommand命令 + + public static SqlCommand CreateCommand(SqlConnection connection, string spName, params string[] sourceColumns) + { + + if (connection == null) throw new ArgumentNullException("connection"); + + if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName"); + + // 创建命令 + + SqlCommand cmd = new SqlCommand(spName, connection); + + cmd.CommandType = CommandType.StoredProcedure; + + // 如果有参数值 + + if ((sourceColumns != null) && (sourceColumns.Length > 0)) + { + + // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. () + + SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connection, spName); + + // 将源表的列到映射到DataSet命令中. + + for (int index = 0; index < sourceColumns.Length; index++) + + commandParameters[index].SourceColumn = sourceColumns[index]; + + // Attach the discovered parameters to the SqlCommand object + + AttachParameters(cmd, commandParameters); + + } + + return cmd; + + } + + #endregion + + #region ExecuteNonQueryTypedParams 类型化参数(DataRow) + + /// + + /// 执行指定连接数据库连接字符串的存储过程,使用DataRow做为参数值,返回受影响的行数. + + /// + + /// 一个有效的数据库连接字符串 + + /// 存储过程名称 + + /// 使用DataRow作为参数值 + + /// 返回影响的行数 + + public static int ExecuteNonQueryTypedParams(String connectionString, String spName, DataRow dataRow) + { + + if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString"); + + if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName"); + + + + // 如果row有值,存储过程必须初始化. + + if (dataRow != null && dataRow.ItemArray.Length > 0) + { + + // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. () + + SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connectionString, spName); + + + + // 分配参数值 + + AssignParameterValues(commandParameters, dataRow); + + + + return SqlHelper.ExecuteNonQuery(connectionString, CommandType.StoredProcedure, spName, commandParameters); + + } + + else + { + + return SqlHelper.ExecuteNonQuery(connectionString, CommandType.StoredProcedure, spName); + + } + + } + + + + /// + + /// 执行指定连接数据库连接对象的存储过程,使用DataRow做为参数值,返回受影响的行数. + + /// + + /// 一个有效的数据库连接对象 + + /// 存储过程名称 + + /// 使用DataRow作为参数值 + + /// 返回影响的行数 + + public static int ExecuteNonQueryTypedParams(SqlConnection connection, String spName, DataRow dataRow) + { + + if (connection == null) throw new ArgumentNullException("connection"); + + if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName"); + + // 如果row有值,存储过程必须初始化. + + if (dataRow != null && dataRow.ItemArray.Length > 0) + { + + // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. () + + SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connection, spName); + + + + // 分配参数值 + + AssignParameterValues(commandParameters, dataRow); + + + + return SqlHelper.ExecuteNonQuery(connection, CommandType.StoredProcedure, spName, commandParameters); + + } + + else + { + + return SqlHelper.ExecuteNonQuery(connection, CommandType.StoredProcedure, spName); + + } + + } + + + + /// + + /// 执行指定连接数据库事物的存储过程,使用DataRow做为参数值,返回受影响的行数. + + /// + + /// 一个有效的连接事务 object + + /// 存储过程名称 + + /// 使用DataRow作为参数值 + + /// 返回影响的行数 + + public static int ExecuteNonQueryTypedParams(SqlTransaction transaction, String spName, DataRow dataRow) + { + + if (transaction == null) throw new ArgumentNullException("transaction"); + + if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction"); + + if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName"); + + // Sf the row has values, the store procedure parameters must be initialized + + if (dataRow != null && dataRow.ItemArray.Length > 0) + { + + // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. () + + SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(transaction.Connection, spName); + + + + // 分配参数值 + + AssignParameterValues(commandParameters, dataRow); + + + + return SqlHelper.ExecuteNonQuery(transaction, CommandType.StoredProcedure, spName, commandParameters); + + } + + else + { + + return SqlHelper.ExecuteNonQuery(transaction, CommandType.StoredProcedure, spName); + + } + + } + + #endregion + + #region ExecuteDatasetTypedParams 类型化参数(DataRow) + + /// + + /// 执行指定连接数据库连接字符串的存储过程,使用DataRow做为参数值,返回DataSet. + + /// + + /// 一个有效的数据库连接字符串 + + /// 存储过程名称 + + /// 使用DataRow作为参数值 + + /// 返回一个包含结果集的DataSet. + + public static DataSet ExecuteDatasetTypedParams(string connectionString, String spName, DataRow dataRow) + { + + if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString"); + + if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName"); + + //如果row有值,存储过程必须初始化. + + if (dataRow != null && dataRow.ItemArray.Length > 0) + { + + // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. () + + SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connectionString, spName); + + + + // 分配参数值 + + AssignParameterValues(commandParameters, dataRow); + + + + return SqlHelper.ExecuteDataset(connectionString, CommandType.StoredProcedure, spName, commandParameters); + + } + + else + { + + return SqlHelper.ExecuteDataset(connectionString, CommandType.StoredProcedure, spName); + + } + + } + + + + /// + + /// 执行指定连接数据库连接对象的存储过程,使用DataRow做为参数值,返回DataSet. + + /// + + /// 一个有效的数据库连接对象 + + /// 存储过程名称 + + /// 使用DataRow作为参数值 + + /// 返回一个包含结果集的DataSet. + + /// + + public static DataSet ExecuteDatasetTypedParams(SqlConnection connection, String spName, DataRow dataRow) + { + + if (connection == null) throw new ArgumentNullException("connection"); + + if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName"); + + // 如果row有值,存储过程必须初始化. + + if (dataRow != null && dataRow.ItemArray.Length > 0) + { + + // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. () + + SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connection, spName); + + + + // 分配参数值 + + AssignParameterValues(commandParameters, dataRow); + + + + return SqlHelper.ExecuteDataset(connection, CommandType.StoredProcedure, spName, commandParameters); + + } + + else + { + + return SqlHelper.ExecuteDataset(connection, CommandType.StoredProcedure, spName); + + } + + } + + + + /// + + /// 执行指定连接数据库事务的存储过程,使用DataRow做为参数值,返回DataSet. + + /// + + /// 一个有效的连接事务 object + + /// 存储过程名称 + + /// 使用DataRow作为参数值 + + /// 返回一个包含结果集的DataSet. + + public static DataSet ExecuteDatasetTypedParams(SqlTransaction transaction, String spName, DataRow dataRow) + { + + if (transaction == null) throw new ArgumentNullException("transaction"); + + if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction"); + + if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName"); + + // 如果row有值,存储过程必须初始化. + + if (dataRow != null && dataRow.ItemArray.Length > 0) + { + + // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. () + + SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(transaction.Connection, spName); + + + + // 分配参数值 + + AssignParameterValues(commandParameters, dataRow); + + + + return SqlHelper.ExecuteDataset(transaction, CommandType.StoredProcedure, spName, commandParameters); + + } + + else + { + + return SqlHelper.ExecuteDataset(transaction, CommandType.StoredProcedure, spName); + + } + + } + + #endregion + + #region ExecuteReaderTypedParams 类型化参数(DataRow) + + /// + + /// 执行指定连接数据库连接字符串的存储过程,使用DataRow做为参数值,返回DataReader. + + /// + + /// 一个有效的数据库连接字符串 + + /// 存储过程名称 + + /// 使用DataRow作为参数值 + + /// 返回包含结果集的SqlDataReader + + public static SqlDataReader ExecuteReaderTypedParams(String connectionString, String spName, DataRow dataRow) + { + + if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString"); + + if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName"); + + + + // 如果row有值,存储过程必须初始化. + + if (dataRow != null && dataRow.ItemArray.Length > 0) + { + + // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. () + + SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connectionString, spName); + + + + // 分配参数值 + + AssignParameterValues(commandParameters, dataRow); + + + + return SqlHelper.ExecuteReader(connectionString, CommandType.StoredProcedure, spName, commandParameters); + + } + + else + { + + return SqlHelper.ExecuteReader(connectionString, CommandType.StoredProcedure, spName); + + } + + } + + + + /// + + /// 执行指定连接数据库连接对象的存储过程,使用DataRow做为参数值,返回DataReader. + + /// + + /// 一个有效的数据库连接对象 + + /// 存储过程名称 + + /// 使用DataRow作为参数值 + + /// 返回包含结果集的SqlDataReader + + public static SqlDataReader ExecuteReaderTypedParams(SqlConnection connection, String spName, DataRow dataRow) + { + + if (connection == null) throw new ArgumentNullException("connection"); + + if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName"); + + // 如果row有值,存储过程必须初始化. + + if (dataRow != null && dataRow.ItemArray.Length > 0) + { + + // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. () + + SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connection, spName); + + + + // 分配参数值 + + AssignParameterValues(commandParameters, dataRow); + + + + return SqlHelper.ExecuteReader(connection, CommandType.StoredProcedure, spName, commandParameters); + + } + + else + { + + return SqlHelper.ExecuteReader(connection, CommandType.StoredProcedure, spName); + + } + + } + + + + /// + + /// 执行指定连接数据库事物的存储过程,使用DataRow做为参数值,返回DataReader. + + /// + + /// 一个有效的连接事务 object + + /// 存储过程名称 + + /// 使用DataRow作为参数值 + + /// 返回包含结果集的SqlDataReader + + public static SqlDataReader ExecuteReaderTypedParams(SqlTransaction transaction, String spName, DataRow dataRow) + { + + if (transaction == null) throw new ArgumentNullException("transaction"); + + if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction"); + + if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName"); + + // 如果row有值,存储过程必须初始化. + + if (dataRow != null && dataRow.ItemArray.Length > 0) + { + + // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. () + + SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(transaction.Connection, spName); + + + + // 分配参数值 + + AssignParameterValues(commandParameters, dataRow); + + + + return SqlHelper.ExecuteReader(transaction, CommandType.StoredProcedure, spName, commandParameters); + + } + + else + { + + return SqlHelper.ExecuteReader(transaction, CommandType.StoredProcedure, spName); + + } + + } + + #endregion + + #region ExecuteScalarTypedParams 类型化参数(DataRow) + + /// + + /// 执行指定连接数据库连接字符串的存储过程,使用DataRow做为参数值,返回结果集中的第一行第一列. + + /// + + /// 一个有效的数据库连接字符串 + + /// 存储过程名称 + + /// 使用DataRow作为参数值 + + /// 返回结果集中的第一行第一列 + + public static object ExecuteScalarTypedParams(String connectionString, String spName, DataRow dataRow) + { + + if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString"); + + if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName"); + + + + // 如果row有值,存储过程必须初始化. + + if (dataRow != null && dataRow.ItemArray.Length > 0) + { + + // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. () + + SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connectionString, spName); + + + + // 分配参数值 + + AssignParameterValues(commandParameters, dataRow); + + + + return SqlHelper.ExecuteScalar(connectionString, CommandType.StoredProcedure, spName, commandParameters); + + } + + else + { + + return SqlHelper.ExecuteScalar(connectionString, CommandType.StoredProcedure, spName); + + } + + } + + + + /// + + /// 执行指定连接数据库连接对象的存储过程,使用DataRow做为参数值,返回结果集中的第一行第一列. + + /// + + /// 一个有效的数据库连接对象 + + /// 存储过程名称 + + /// 使用DataRow作为参数值 + + /// 返回结果集中的第一行第一列 + + public static object ExecuteScalarTypedParams(SqlConnection connection, String spName, DataRow dataRow) + { + + if (connection == null) throw new ArgumentNullException("connection"); + + if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName"); + + // 如果row有值,存储过程必须初始化. + + if (dataRow != null && dataRow.ItemArray.Length > 0) + { + + // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. () + + SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connection, spName); + + + + // 分配参数值 + + AssignParameterValues(commandParameters, dataRow); + + + + return SqlHelper.ExecuteScalar(connection, CommandType.StoredProcedure, spName, commandParameters); + + } + + else + { + + return SqlHelper.ExecuteScalar(connection, CommandType.StoredProcedure, spName); + + } + + } + + + + /// + + /// 执行指定连接数据库事务的存储过程,使用DataRow做为参数值,返回结果集中的第一行第一列. + + /// + + /// 一个有效的连接事务 object + + /// 存储过程名称 + + /// 使用DataRow作为参数值 + + /// 返回结果集中的第一行第一列 + + public static object ExecuteScalarTypedParams(SqlTransaction transaction, String spName, DataRow dataRow) + { + + if (transaction == null) throw new ArgumentNullException("transaction"); + + if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction"); + + if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName"); + + // 如果row有值,存储过程必须初始化. + + if (dataRow != null && dataRow.ItemArray.Length > 0) + { + + // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. () + + SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(transaction.Connection, spName); + + + + // 分配参数值 + + AssignParameterValues(commandParameters, dataRow); + + + + return SqlHelper.ExecuteScalar(transaction, CommandType.StoredProcedure, spName, commandParameters); + + } + + else + { + + return SqlHelper.ExecuteScalar(transaction, CommandType.StoredProcedure, spName); + + } + + } + + #endregion + + #region ExecuteXmlReaderTypedParams 类型化参数(DataRow) + + /// + + /// 执行指定连接数据库连接对象的存储过程,使用DataRow做为参数值,返回XmlReader类型的结果集. + + /// + + /// 一个有效的数据库连接对象 + + /// 存储过程名称 + + /// 使用DataRow作为参数值 + + /// 返回XmlReader结果集对象. + + public static XmlReader ExecuteXmlReaderTypedParams(SqlConnection connection, String spName, DataRow dataRow) + { + + if (connection == null) throw new ArgumentNullException("connection"); + + if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName"); + + // 如果row有值,存储过程必须初始化. + + if (dataRow != null && dataRow.ItemArray.Length > 0) + { + + // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. () + + SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(connection, spName); + + + + // 分配参数值 + + AssignParameterValues(commandParameters, dataRow); + + + + return SqlHelper.ExecuteXmlReader(connection, CommandType.StoredProcedure, spName, commandParameters); + + } + + else + { + + return SqlHelper.ExecuteXmlReader(connection, CommandType.StoredProcedure, spName); + + } + + } + + + + /// + + /// 执行指定连接数据库事务的存储过程,使用DataRow做为参数值,返回XmlReader类型的结果集. + + /// + + /// 一个有效的连接事务 object + + /// 存储过程名称 + + /// 使用DataRow作为参数值 + + /// 返回XmlReader结果集对象. + + public static XmlReader ExecuteXmlReaderTypedParams(SqlTransaction transaction, String spName, DataRow dataRow) + { + + if (transaction == null) throw new ArgumentNullException("transaction"); + + if (transaction != null && transaction.Connection == null) throw new ArgumentException("The transaction was rollbacked or commited, please provide an open transaction.", "transaction"); + + if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName"); + + // 如果row有值,存储过程必须初始化. + + if (dataRow != null && dataRow.ItemArray.Length > 0) + { + + // 从缓存中加载存储过程参数,如果缓存中不存在则从数据库中检索参数信息并加载到缓存中. () + + SqlParameter[] commandParameters = SqlHelperParameterCache.GetSpParameterSet(transaction.Connection, spName); + + + + // 分配参数值 + + AssignParameterValues(commandParameters, dataRow); + + + + return SqlHelper.ExecuteXmlReader(transaction, CommandType.StoredProcedure, spName, commandParameters); + + } + + else + { + + return SqlHelper.ExecuteXmlReader(transaction, CommandType.StoredProcedure, spName); + + } + + } + + #endregion + } + /// + /// SqlHelperParameterCache提供缓存存储过程参数,并能够在运行时从存储过程中探索参数. + /// + public sealed class SqlHelperParameterCache + { + #region 私有方法,字段,构造函数 + + // 私有构造函数,妨止类被实例化. + + private SqlHelperParameterCache() { } + + // 这个方法要注意 + + private static Hashtable paramCache = Hashtable.Synchronized(new Hashtable()); + + /// + + /// 探索运行时的存储过程,返回SqlParameter参数数组. + + /// 初始化参数值为 DBNull.Value. + + /// + + /// 一个有效的数据库连接 + + /// 存储过程名称 + + /// 是否包含返回值参数 + + /// 返回SqlParameter参数数组 + + private static SqlParameter[] DiscoverSpParameterSet(SqlConnection connection, string spName, bool includeReturnValueParameter) + { + + if (connection == null) throw new ArgumentNullException("connection"); + + if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName"); + + SqlCommand cmd = new SqlCommand(spName, connection); + + cmd.CommandType = CommandType.StoredProcedure; + + connection.Open(); + + // 检索cmd指定的存储过程的参数信息,并填充到cmd的Parameters参数集中. + + SqlCommandBuilder.DeriveParameters(cmd); + + connection.Close(); + + // 如果不包含返回值参数,将参数集中的每一个参数删除. + + if (!includeReturnValueParameter) + { + + cmd.Parameters.RemoveAt(0); + + } + + + + // 创建参数数组 + + SqlParameter[] discoveredParameters = new SqlParameter[cmd.Parameters.Count]; + + // 将cmd的Parameters参数集复制到discoveredParameters数组. + + cmd.Parameters.CopyTo(discoveredParameters, 0); + + // 初始化参数值为 DBNull.Value. + + foreach (SqlParameter discoveredParameter in discoveredParameters) + { + + discoveredParameter.Value = DBNull.Value; + + } + + return discoveredParameters; + + } + + + + /// + + /// SqlParameter参数数组的深层拷贝. + + /// + + /// 原始参数数组 + + /// 返回一个同样的参数数组 + + private static SqlParameter[] CloneParameters(SqlParameter[] originalParameters) + { + + SqlParameter[] clonedParameters = new SqlParameter[originalParameters.Length]; + + for (int i = 0, j = originalParameters.Length; i < j; i++) + { + + clonedParameters[i] = (SqlParameter)((ICloneable)originalParameters[i]).Clone(); + + } + + return clonedParameters; + + } + + #endregion 私有方法,字段,构造函数结束 + + #region 缓存方法 + + /// + + /// 追加参数数组到缓存. + + /// + + /// 一个有效的数据库连接字符串 + + /// 存储过程名或SQL语句 + + /// 要缓存的参数数组 + + public static void CacheParameterSet(string connectionString, string commandText, params SqlParameter[] commandParameters) + { + + if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString"); + + if (commandText == null || commandText.Length == 0) throw new ArgumentNullException("commandText"); + + string hashKey = connectionString + ":" + commandText; + + paramCache[hashKey] = commandParameters; + + } + + + + /// + + /// 从缓存中获取参数数组. + + /// + + /// 一个有效的数据库连接字符 + + /// 存储过程名或SQL语句 + + /// 参数数组 + + public static SqlParameter[] GetCachedParameterSet(string connectionString, string commandText) + { + + if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString"); + + if (commandText == null || commandText.Length == 0) throw new ArgumentNullException("commandText"); + + string hashKey = connectionString + ":" + commandText; + + SqlParameter[] cachedParameters = paramCache[hashKey] as SqlParameter[]; + + if (cachedParameters == null) + { + + return null; + + } + + else + { + + return CloneParameters(cachedParameters); + + } + + } + + #endregion 缓存方法结束 + + #region 检索指定的存储过程的参数集 + + /// + + /// 返回指定的存储过程的参数集 + + /// + + /// + + /// 这个方法将查询数据库,并将信息存储到缓存. + + /// + + /// 一个有效的数据库连接字符 + + /// 存储过程名 + + /// 返回SqlParameter参数数组 + + public static SqlParameter[] GetSpParameterSet(string connectionString, string spName) + { + + return GetSpParameterSet(connectionString, spName, false); + + } + + + + /// + + /// 返回指定的存储过程的参数集 + + /// + + /// + + /// 这个方法将查询数据库,并将信息存储到缓存. + + /// + + /// 一个有效的数据库连接字符. + + /// 存储过程名 + + /// 是否包含返回值参数 + + /// 返回SqlParameter参数数组 + + public static SqlParameter[] GetSpParameterSet(string connectionString, string spName, bool includeReturnValueParameter) + { + + if (connectionString == null || connectionString.Length == 0) throw new ArgumentNullException("connectionString"); + + if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName"); + + using (SqlConnection connection = new SqlConnection(connectionString)) + { + + return GetSpParameterSetInternal(connection, spName, includeReturnValueParameter); + + } + + } + + + + /// + + /// [内部]返回指定的存储过程的参数集(使用连接对象). + + /// + + /// + + /// 这个方法将查询数据库,并将信息存储到缓存. + + /// + + /// 一个有效的数据库连接字符 + + /// 存储过程名 + + /// 返回SqlParameter参数数组 + + internal static SqlParameter[] GetSpParameterSet(SqlConnection connection, string spName) + { + + return GetSpParameterSet(connection, spName, false); + + } + + + + /// + + /// [内部]返回指定的存储过程的参数集(使用连接对象) + + /// + + /// + + /// 这个方法将查询数据库,并将信息存储到缓存. + + /// + + /// 一个有效的数据库连接对象 + + /// 存储过程名 + + /// + + /// 是否包含返回值参数 + + /// + + /// 返回SqlParameter参数数组 + + internal static SqlParameter[] GetSpParameterSet(SqlConnection connection, string spName, bool includeReturnValueParameter) + { + + if (connection == null) throw new ArgumentNullException("connection"); + + using (SqlConnection clonedConnection = (SqlConnection)((ICloneable)connection).Clone()) + { + + return GetSpParameterSetInternal(clonedConnection, spName, includeReturnValueParameter); + + } + + } + + + + /// + + /// [私有]返回指定的存储过程的参数集(使用连接对象) + + /// + + /// 一个有效的数据库连接对象 + + /// 存储过程名 + + /// 是否包含返回值参数 + + /// 返回SqlParameter参数数组 + + private static SqlParameter[] GetSpParameterSetInternal(SqlConnection connection, string spName, bool includeReturnValueParameter) + { + + if (connection == null) throw new ArgumentNullException("connection"); + + if (spName == null || spName.Length == 0) throw new ArgumentNullException("spName"); + + string hashKey = connection.ConnectionString + ":" + spName + (includeReturnValueParameter ? ":include ReturnValue Parameter" : ""); + + SqlParameter[] cachedParameters; + + + + cachedParameters = paramCache[hashKey] as SqlParameter[]; + + if (cachedParameters == null) + { + + SqlParameter[] spParameters = DiscoverSpParameterSet(connection, spName, includeReturnValueParameter); + + paramCache[hashKey] = spParameters; + + cachedParameters = spParameters; + + } + + + + return CloneParameters(cachedParameters); + + } + #endregion 参数集检索结束 + } +} + diff --git a/BLWWS_BLL/SqlSugarBase.cs b/BLWWS_BLL/SqlSugarBase.cs new file mode 100644 index 0000000..7d12b3c --- /dev/null +++ b/BLWWS_BLL/SqlSugarBase.cs @@ -0,0 +1,32 @@ +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text; + +namespace BLWWS_BLL +{ + public static class SqlSugarBase + { + public static SqlSugarClient GesmartDb() + { + SqlSugarClient Db = new SqlSugarClient(new ConnectionConfig() + { + ConnectionString = "Server=blv-cloud-db.mysql.rds.aliyuncs.com;Database=Face;Uid=blv_rcu;Pwd=fnadiaJDIJ7546;charset=utf8;port=3307;", + DbType = SqlSugar.DbType.MySql, + InitKeyType = InitKeyType.Attribute,//从特性读取主键和自增列信息 + IsAutoCloseConnection = true,//开启自动释放模式和EF原理一样我就不多解释了 + }); + //用来打印Sql方便调式 + Db.Aop.OnLogExecuting = (sql, pars) => + { + Db.Utilities.SerializeObject(pars.ToDictionary(it => it.ParameterName, it => it.Value)); + Debug.WriteLine(sql); + }; + return Db; + } + + + } +} diff --git a/BLWWS_BLL/Tools.cs b/BLWWS_BLL/Tools.cs new file mode 100644 index 0000000..bbd7b5e --- /dev/null +++ b/BLWWS_BLL/Tools.cs @@ -0,0 +1,160 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; +using System.Xml; +using System.Net; +using System.Text; +using System.IO; +using RestSharp; + +namespace BLWWS_BLL +{ + public static class Tools + { + /// + /// 验证指定的号码是否是手机号码 + /// + /// + /// + public static bool IsMobileNumber(string number) + { + return System.Text.RegularExpressions.Regex.IsMatch(number, @"1[0-9]{10}"); + } + /// + /// 获取验证码 + /// + /// 验证码长度 + /// + public static string CreateValidateCode(int length) + { + int[] randMembers = new int[length]; + int[] validateNums = new int[length]; + System.Text.StringBuilder validateNumberStr = new System.Text.StringBuilder(); + //生成起始序列值 + int seekSeek = unchecked((int)DateTime.Now.Ticks); + Random seekRand = new Random(seekSeek); + int beginSeek = (int)seekRand.Next(0, Int32.MaxValue - length * 10000); + int[] seeks = new int[length]; + for (int i = 0; i < length; i++) + { + beginSeek += 10000; + seeks[i] = beginSeek; + } + //生成随机数字 + for (int i = 0; i < length; i++) + { + Random rand = new Random(seeks[i]); + int pownum = 1 * (int)Math.Pow(10, length); + randMembers[i] = rand.Next(pownum, Int32.MaxValue); + } + //抽取随机数字 + for (int i = 0; i < length; i++) + { + string numStr = randMembers[i].ToString(); + int numLength = numStr.Length; + Random rand = new Random(); + int numPosition = rand.Next(0, numLength - 1); + validateNums[i] = Int32.Parse(numStr.Substring(numPosition, 1)); + } + //生成验证码 + for (int i = 0; i < length; i++) + { + validateNumberStr.Append(validateNums[i].ToString()); + } + return validateNumberStr.ToString(); + } + /// + /// post数据接口 + /// + /// + /// + /// post和put,默认post + /// + public static string PostWebRequest(string url, string postData) + { + string result = string.Empty; + HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url); + req.ContentType = "application/json"; + req.Method = "POST"; + //req.Timeout = 10000;//设置请求超时时间,单位为毫秒 + byte[] data = Encoding.UTF8.GetBytes(postData); + req.ContentLength = data.Length; + using (Stream reqStream = req.GetRequestStream()) + { + reqStream.Write(data, 0, data.Length); + } + HttpWebResponse resp = (HttpWebResponse)req.GetResponse(); + using (Stream stream = resp.GetResponseStream()) + { + using (StreamReader reader = new StreamReader(stream, Encoding.UTF8)) + { + result = reader.ReadToEnd();//获取响应内容 + } + } + return result; + + } + + + public static string PostWebRequestNew(string url, string postData) + { + string content = ""; + try + { + var client1 = new RestClient(url); + var request1 = new RestRequest("", Method.POST); + request1.AddJsonBody(postData); + var Response = client1.Execute(request1).Content; + content = Response; + } + catch (Exception ex) + { + LogHelper.WriteLog(ex.Message); + } + return content; + } + + public static string ByteToString(byte[] bytesData) + { + StringBuilder result = new StringBuilder(); + foreach (byte r in bytesData) + { + result.Append(r.ToString("X2") + " "); + } + return result.ToString().Trim(); + } + + /// + /// 16进制 字符串 转换成 字节 数组 + /// + /// + /// + public static byte[] HEXString2ByteArray(string hexString) + { + char[] hexCharacters = hexString.ToCharArray(); + byte[] byteArray = new byte[hexCharacters.Length / 2]; + + for (int i = 0; i < byteArray.Length; i++) + { + string hexVal = string.Concat(hexCharacters[i * 2], hexCharacters[i * 2 + 1]); + byteArray[i] = Convert.ToByte(hexVal, 16); + } + return byteArray; + + } + + public static long GetCurrentTimeStamp(DateTime dt) + { + TimeSpan ts = dt - new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Local); + long current_timestamp = Convert.ToInt64(ts.TotalSeconds); + return current_timestamp; + } + public static DateTime GetCurrentDateTime(long timestampMilliseconds) + { + DateTime epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Local); + DateTime utcTime = epoch.AddSeconds(timestampMilliseconds); + return utcTime; + } + } +} \ No newline at end of file diff --git a/BLWWS_BLL/Uploadinfo.cs b/BLWWS_BLL/Uploadinfo.cs new file mode 100644 index 0000000..b03fc72 --- /dev/null +++ b/BLWWS_BLL/Uploadinfo.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace BLWWS_BLL +{ + public class Uploadinfo + { + + public string key { get; set; } + public string code { get; set; } + public long checkInID { get; set; } + public int idType { get; set; } + public string idCard { get; set; } + + + public int sex { get; set; } + public string name { get; set; } + + public string birthday { get; set; } + + public string photoUrl { get; set; } + public string photo { get; set; } + + + } +} diff --git a/BLWWS_BLL/app.config b/BLWWS_BLL/app.config new file mode 100644 index 0000000..67d2a79 --- /dev/null +++ b/BLWWS_BLL/app.config @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/BLWWS_BLL/job_scheduling_data_2_0.xsd b/BLWWS_BLL/job_scheduling_data_2_0.xsd new file mode 100644 index 0000000..7bff0f0 --- /dev/null +++ b/BLWWS_BLL/job_scheduling_data_2_0.xsd @@ -0,0 +1,364 @@ + + + + + + + Root level node + + + + + + Commands to be executed before scheduling the jobs and triggers in this file. + + + + + Directives to be followed while scheduling the jobs and triggers in this file. + + + + + + + + + + + + + + Version of the XML Schema instance + + + + + + + + + + Delete all jobs, if any, in the identified group. "*" can be used to identify all groups. Will also result in deleting all triggers related to the jobs. + + + + + Delete all triggers, if any, in the identified group. "*" can be used to identify all groups. Will also result in deletion of related jobs that are non-durable. + + + + + Delete the identified job if it exists (will also result in deleting all triggers related to it). + + + + + + + + + + + Delete the identified trigger if it exists (will also result in deletion of related jobs that are non-durable). + + + + + + + + + + + + + + + + Whether the existing scheduling data (with same identifiers) will be overwritten. If false, and ignore-duplicates is not false, and jobs or triggers with the same names already exist as those in the file, an error will occur. + + + + + If true (and overwrite-existing-data is false) then any job/triggers encountered in this file that have names that already exist in the scheduler will be ignored, and no error will be produced. + + + + + If true trigger's start time is calculated based on earlier run time instead of fixed value. Trigger's start time must be undefined for this to work. + + + + + + + + Define a JobDetail + + + + + + + + + + + + + + + + + Define a JobDataMap + + + + + + + + + Define a JobDataMap entry + + + + + + + + + + Define a Trigger + + + + + + + + + + + Common Trigger definitions + + + + + + + + + + + + + + + + + + + + + + + Define a SimpleTrigger + + + + + + + + + + + + + + + + + Define a CronTrigger + + + + + + + + + + + + + + + Define a DateIntervalTrigger + + + + + + + + + + + + + + + + Cron expression (see JavaDoc for examples) + + Special thanks to Chris Thatcher (thatcher@butterfly.net) for the regular expression! + + Regular expressions are not my strong point but I believe this is complete, + with the caveat that order for expressions like 3-0 is not legal but will pass, + and month and day names must be capitalized. + If you want to examine the correctness look for the [\s] to denote the + seperation of individual regular expressions. This is how I break them up visually + to examine them: + + SECONDS: + ( + ((([0-9]|[0-5][0-9])(-([0-9]|[0-5][0-9]))?,)*([0-9]|[0-5][0-9])(-([0-9]|[0-5][0-9]))?) + | (([\*]|[0-9]|[0-5][0-9])/([0-9]|[0-5][0-9])) + | ([\?]) + | ([\*]) + ) [\s] + MINUTES: + ( + ((([0-9]|[0-5][0-9])(-([0-9]|[0-5][0-9]))?,)*([0-9]|[0-5][0-9])(-([0-9]|[0-5][0-9]))?) + | (([\*]|[0-9]|[0-5][0-9])/([0-9]|[0-5][0-9])) + | ([\?]) + | ([\*]) + ) [\s] + HOURS: + ( + ((([0-9]|[0-1][0-9]|[2][0-3])(-([0-9]|[0-1][0-9]|[2][0-3]))?,)*([0-9]|[0-1][0-9]|[2][0-3])(-([0-9]|[0-1][0-9]|[2][0-3]))?) + | (([\*]|[0-9]|[0-1][0-9]|[2][0-3])/([0-9]|[0-1][0-9]|[2][0-3])) + | ([\?]) + | ([\*]) + ) [\s] + DAY OF MONTH: + ( + ((([1-9]|[0][1-9]|[1-2][0-9]|[3][0-1])(-([1-9]|[0][1-9]|[1-2][0-9]|[3][0-1]))?,)*([1-9]|[0][1-9]|[1-2][0-9]|[3][0-1])(-([1-9]|[0][1-9]|[1-2][0-9]|[3][0-1]))?(C)?) + | (([1-9]|[0][1-9]|[1-2][0-9]|[3][0-1])/([1-9]|[0][1-9]|[1-2][0-9]|[3][0-1])(C)?) + | (L(-[0-9])?) + | (L(-[1-2][0-9])?) + | (L(-[3][0-1])?) + | (LW) + | ([1-9]W) + | ([1-3][0-9]W) + | ([\?]) + | ([\*]) + )[\s] + MONTH: + ( + ((([1-9]|0[1-9]|1[0-2])(-([1-9]|0[1-9]|1[0-2]))?,)*([1-9]|0[1-9]|1[0-2])(-([1-9]|0[1-9]|1[0-2]))?) + | (([1-9]|0[1-9]|1[0-2])/([1-9]|0[1-9]|1[0-2])) + | (((JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)(-(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC))?,)*(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)(-(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC))?) + | ((JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)/(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)) + | ([\?]) + | ([\*]) + )[\s] + DAY OF WEEK: + ( + (([1-7](-([1-7]))?,)*([1-7])(-([1-7]))?) + | ([1-7]/([1-7])) + | (((MON|TUE|WED|THU|FRI|SAT|SUN)(-(MON|TUE|WED|THU|FRI|SAT|SUN))?,)*(MON|TUE|WED|THU|FRI|SAT|SUN)(-(MON|TUE|WED|THU|FRI|SAT|SUN))?(C)?) + | ((MON|TUE|WED|THU|FRI|SAT|SUN)/(MON|TUE|WED|THU|FRI|SAT|SUN)(C)?) + | (([1-7]|(MON|TUE|WED|THU|FRI|SAT|SUN))(L|LW)?) + | (([1-7]|MON|TUE|WED|THU|FRI|SAT|SUN)#([1-7])?) + | ([\?]) + | ([\*]) + ) + YEAR (OPTIONAL): + ( + [\s]? + ([\*])? + | ((19[7-9][0-9])|(20[0-9][0-9]))? + | (((19[7-9][0-9])|(20[0-9][0-9]))/((19[7-9][0-9])|(20[0-9][0-9])))? + | ((((19[7-9][0-9])|(20[0-9][0-9]))(-((19[7-9][0-9])|(20[0-9][0-9])))?,)*((19[7-9][0-9])|(20[0-9][0-9]))(-((19[7-9][0-9])|(20[0-9][0-9])))?)? + ) + + + + + + + + + + Number of times to repeat the Trigger (-1 for indefinite) + + + + + + + + + + Simple Trigger Misfire Instructions + + + + + + + + + + + + + + + Cron Trigger Misfire Instructions + + + + + + + + + + + + Date Interval Trigger Misfire Instructions + + + + + + + + + + + + Interval Units + + + + + + + + + + + + + \ No newline at end of file diff --git a/BLWWS_BLL/packages.config b/BLWWS_BLL/packages.config new file mode 100644 index 0000000..f870c03 --- /dev/null +++ b/BLWWS_BLL/packages.config @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/BLWWS_BLL/pmsLog.cs b/BLWWS_BLL/pmsLog.cs new file mode 100644 index 0000000..3b1d236 --- /dev/null +++ b/BLWWS_BLL/pmsLog.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace BLWWS_BLL +{ + public class pmsLog + { + public int id { get; set; } + public int pmsid { get; set; } + public Nullable step { get; set; } + public Nullable app { get; set; } + public Nullable Creationtime { get; set; } + public string message { get; set; } + public string Data { get; set; } + public string HotelCode { get; set; } + public string roomid { get; set; } + public string Ip { get; set; } + + } +} diff --git a/BLW_Interface_git.sln b/BLW_Interface_git.sln new file mode 100644 index 0000000..bb19a53 --- /dev/null +++ b/BLW_Interface_git.sln @@ -0,0 +1,79 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.9.34723.18 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BLWWS", "BLWWS\BLWWS.csproj", "{3D1C2418-8F29-4D2F-B7E9-BDBCD0FE021E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BLWWS_BLL", "BLWWS_BLL\BLWWS_BLL.csproj", "{CF2AB5DE-C3AF-4388-B6C4-EFA14BAF3316}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConsoleApp1", "ConsoleApp1\ConsoleApp1.csproj", "{CEEE2228-3250-4886-AECF-AB66211C41E6}" + ProjectSection(ProjectDependencies) = postProject + {3D1C2418-8F29-4D2F-B7E9-BDBCD0FE021E} = {3D1C2418-8F29-4D2F-B7E9-BDBCD0FE021E} + EndProjectSection +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConsoleApp2", "ConsoleApp2\ConsoleApp2.csproj", "{6AAB5105-5C97-4E7A-A4DC-9CF90B0F72B5}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MyQianLiMa", "MyQianLiMa\MyQianLiMa.csproj", "{D7F82DA5-DC79-4308-BA3E-304287123032}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConsoleApp6", "ConsoleApp6\ConsoleApp6.csproj", "{02BC4AA5-6542-4CA8-B540-C435F15392AE}" + ProjectSection(ProjectDependencies) = postProject + {3D1C2418-8F29-4D2F-B7E9-BDBCD0FE021E} = {3D1C2418-8F29-4D2F-B7E9-BDBCD0FE021E} + EndProjectSection +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConsoleApp7", "ConsoleApp7\ConsoleApp7.csproj", "{8F89AC96-6F8F-46A0-A443-352B295A5EA0}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HttpsTran", "HttpsTran\HttpsTran.csproj", "{BB1F703D-36E6-4C5B-9BCF-D7A6FB97C113}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PMSLogProduce", "PMSLogProduce\PMSLogProduce.csproj", "{90D966FB-EA52-4991-B85B-111D1054E4B2}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {3D1C2418-8F29-4D2F-B7E9-BDBCD0FE021E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3D1C2418-8F29-4D2F-B7E9-BDBCD0FE021E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3D1C2418-8F29-4D2F-B7E9-BDBCD0FE021E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3D1C2418-8F29-4D2F-B7E9-BDBCD0FE021E}.Release|Any CPU.Build.0 = Release|Any CPU + {CF2AB5DE-C3AF-4388-B6C4-EFA14BAF3316}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CF2AB5DE-C3AF-4388-B6C4-EFA14BAF3316}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CF2AB5DE-C3AF-4388-B6C4-EFA14BAF3316}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CF2AB5DE-C3AF-4388-B6C4-EFA14BAF3316}.Release|Any CPU.Build.0 = Release|Any CPU + {CEEE2228-3250-4886-AECF-AB66211C41E6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CEEE2228-3250-4886-AECF-AB66211C41E6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CEEE2228-3250-4886-AECF-AB66211C41E6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CEEE2228-3250-4886-AECF-AB66211C41E6}.Release|Any CPU.Build.0 = Release|Any CPU + {6AAB5105-5C97-4E7A-A4DC-9CF90B0F72B5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6AAB5105-5C97-4E7A-A4DC-9CF90B0F72B5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6AAB5105-5C97-4E7A-A4DC-9CF90B0F72B5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6AAB5105-5C97-4E7A-A4DC-9CF90B0F72B5}.Release|Any CPU.Build.0 = Release|Any CPU + {D7F82DA5-DC79-4308-BA3E-304287123032}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D7F82DA5-DC79-4308-BA3E-304287123032}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D7F82DA5-DC79-4308-BA3E-304287123032}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D7F82DA5-DC79-4308-BA3E-304287123032}.Release|Any CPU.Build.0 = Release|Any CPU + {02BC4AA5-6542-4CA8-B540-C435F15392AE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {02BC4AA5-6542-4CA8-B540-C435F15392AE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {02BC4AA5-6542-4CA8-B540-C435F15392AE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {02BC4AA5-6542-4CA8-B540-C435F15392AE}.Release|Any CPU.Build.0 = Release|Any CPU + {8F89AC96-6F8F-46A0-A443-352B295A5EA0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8F89AC96-6F8F-46A0-A443-352B295A5EA0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8F89AC96-6F8F-46A0-A443-352B295A5EA0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8F89AC96-6F8F-46A0-A443-352B295A5EA0}.Release|Any CPU.Build.0 = Release|Any CPU + {BB1F703D-36E6-4C5B-9BCF-D7A6FB97C113}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BB1F703D-36E6-4C5B-9BCF-D7A6FB97C113}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BB1F703D-36E6-4C5B-9BCF-D7A6FB97C113}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BB1F703D-36E6-4C5B-9BCF-D7A6FB97C113}.Release|Any CPU.Build.0 = Release|Any CPU + {90D966FB-EA52-4991-B85B-111D1054E4B2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {90D966FB-EA52-4991-B85B-111D1054E4B2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {90D966FB-EA52-4991-B85B-111D1054E4B2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {90D966FB-EA52-4991-B85B-111D1054E4B2}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {A569AA4F-F1B7-4B26-BB35-02D271DBC68D} + EndGlobalSection +EndGlobal diff --git a/ConsoleApp1/App.config b/ConsoleApp1/App.config new file mode 100644 index 0000000..0838d9e --- /dev/null +++ b/ConsoleApp1/App.config @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ConsoleApp1/ConsoleApp1.csproj b/ConsoleApp1/ConsoleApp1.csproj new file mode 100644 index 0000000..f83751b --- /dev/null +++ b/ConsoleApp1/ConsoleApp1.csproj @@ -0,0 +1,103 @@ + + + + + Debug + AnyCPU + {CEEE2228-3250-4886-AECF-AB66211C41E6} + Exe + ConsoleApp1 + ConsoleApp1 + v4.8 + 512 + true + true + + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + false + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + + ..\packages\Microsoft.Bcl.AsyncInterfaces.8.0.0\lib\net462\Microsoft.Bcl.AsyncInterfaces.dll + + + + ..\RestSharp\RestSharp.dll + + + + ..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll + + + + + ..\packages\System.Memory.4.5.5\lib\net461\System.Memory.dll + + + + + ..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll + + + ..\packages\System.Runtime.CompilerServices.Unsafe.6.0.0\lib\net461\System.Runtime.CompilerServices.Unsafe.dll + + + + + ..\packages\System.Text.Encodings.Web.8.0.0\lib\net462\System.Text.Encodings.Web.dll + + + ..\packages\System.Text.Json.8.0.4\lib\net462\System.Text.Json.dll + + + ..\packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll + + + ..\packages\System.ValueTuple.4.5.0\lib\net47\System.ValueTuple.dll + + + + + + + + + + + + + + + + + + + + + + + {CF2AB5DE-C3AF-4388-B6C4-EFA14BAF3316} + BLWWS_BLL + + + + \ No newline at end of file diff --git a/ConsoleApp1/Program.cs b/ConsoleApp1/Program.cs new file mode 100644 index 0000000..1bc90e3 --- /dev/null +++ b/ConsoleApp1/Program.cs @@ -0,0 +1,441 @@ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Messaging; +using System.Net; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using System.Xml; +using System.Xml.Linq; +using BLWWS_BLL; +using ConsoleApp1; +using Newtonsoft.Json; +using RestSharp; + +namespace ConsoleApp1 +{ + + public class portinfo + { + /// + /// 名称 + /// + public string LodgerNmae { get; set; } + /// + /// 身份证 + /// + public string IDNumber { get; set; } + /// + /// 性别 0女 1男 + /// + public Nullable Sex { get; set; } + /// + /// 创建时间 + /// + public Nullable CheckInDate { get; set; } + /// + /// 消息来源 + /// + public int Sourcedian { get; set; } + + /// + /// 图片 + /// + public string picture { get; set; } + + /// + /// 备注 + /// + public string remark { get; set; } + + /// + /// 图片时间 + /// + public Nullable pictureDate { get; set; } + /// + /// 酒店code + /// + public string HotelCode { get; set; } + /// + /// 房间号 + /// + public string roomid { get; set; } + /// + /// 电话号码 + /// + public string phonenumber { get; set; } + /// + /// 开房时间 + /// + public DateTime CheckTime { get; set; } + + /// + /// 退房时间 + /// + public DateTime checkOutTime { get; set; } + + /// + /// 密钥 + /// + public string key { get; set; } + public int pmsinfoid { get; set; } + } +} + + +public class XMSData +{ + public string hotelid { get; set; } + /// + /// 订单账号(酒店唯一) + /// + public string accnt { get; set; } + + public string groupid { get; set; } + public string name { get; set; } + public Dictionary original { get; set; } + public extrasData extras { get; set; } +} +public class originalData +{ + //public string name { get; set; } + //public string mobile { get; set; } + //public string roomno { get; set; } + //public string type { get; set; } + //public string rtc { get; set; } + //public string rmnum { get; set; } + //public string sta { get; set; } +} +// "arr":"1750586400000", +// "rtc":"CPC", +// "sta":"R", +// "rmnum":"1", +// "roomno":"", +// "mobile":"1212345678", +// "name":"李二", +// "type":"CPC", +// "dep":"1750651200000" +public class extrasData +{ + public string name { get; set; } + public string mobile { get; set; } + /// + /// 房间号 + /// + public string roomno { get; set; } + public string type { get; set; } + public string rtc { get; set; } + public string rmnum { get; set; } + + /// + /// 订单状态 + ///Q:问询 + ///X:取消预订 + ///N:noshow + ///R:预订 + ///I:在住 + ///O:本日结账 + ///S:挂账退房 + ///D:昨日结账 + ///H:历史订单 + /// + public string sta { get; set; } + public string arr { get; set; } + public string dep { get; set; } +} +internal class Program +{ + public static long GetCurrentTimeStamp(DateTime dt) + { + TimeSpan ts = dt - new DateTime(1970, 1, 1, 8, 0, 0, DateTimeKind.Local); + long current_timestamp = Convert.ToInt64(ts.TotalSeconds); + return current_timestamp; + } + public class PMSDataBase + { + public string hotel_code { get; set; } = ""; + public string time { get; set; } = ""; + public string sign { get; set; } = ""; + public string hotel_id { get; set; } = ""; + public string order_no { get; set; } = ""; + public string room_no { get; set; } = ""; + public string check_out_original { get; set; } + } + static void Main(string[] args) + { + + var DQQQ = File.ReadAllText("1.txt"); + + + + // + + XDocument doc32 = XDocument.Parse(DQQQ); + XElement Root1 = doc32.Root; + string orderno = Root1.Attribute("orderno")?.Value; + string cost = Root1.Attribute("cost")?.Value; + + //是否有早餐 + string breakfast = Root1.Attribute("breakfast")?.Value; + //押金 + string deposit = Root1.Attribute("deposit")?.Value; + + var LESuuu = Root1.Elements("item"); + + + + + var NNNjkl = JsonConvert.DeserializeObject>>(DQQQ); + PMSDataBase data = new PMSDataBase() + { + hotel_code = "2079", + time = "1751426235", + sign = "a68b2596ce7c1ca970e82a00626c16e3", + hotel_id = "1101", + order_no = "", + room_no = "1102", + check_out_original = "" + }; + + string BaseURL = "https://f.blv-oa.com:8099/rcu_pms_api/v1"; + var client123 = new RestClient(BaseURL); + var request123 = new RestRequest("/order/checkOut", Method.POST); + request123.AddJsonBody(data); + var Response = client123.Execute(request123).Content; + string content12345 = Response; + + + long lllhhh = GetCurrentTimeStamp(DateTime.Now); + decimal DDD = Convert.ToDecimal(32432423.34343); + decimal lll = DDD / 1024; + decimal a = Math.Round(lll, 2); + Console.WriteLine("aaaaaaaaaaaa"); + + string content = ""; + + + string PPP = File.ReadAllText("3.txt"); + byte[] photo = Tools.HEXString2ByteArray(PPP); + + //分辨率 判断 + using (var ms = new MemoryStream(photo)) + { + ms.Write(photo, 0, photo.Length); + using (System.Drawing.Image image = System.Drawing.Image.FromStream(ms, false, false)) // 不加载图像数据 + { + bool bf = image.RawFormat.Equals(System.Drawing.Imaging.ImageFormat.Jpeg); + Console.WriteLine(image.Height); + Console.WriteLine(image.Width); + } + } + + + try + { + + string sss111 = File.ReadAllText("3.txt"); + var OOO = JsonConvert.DeserializeObject(sss111); + string Url111 = "http://pms.boonlive-rcu.com:8989"; + var client1 = new RestClient(Url111); + //var request1 = new RestRequest("api/XMSOrderPush?xrsecret=Ip202rSR132zJGKH", Method.POST); + var request1 = new RestRequest("api/XMSOrderPush", Method.POST); + request1.AddQueryParameter("xrsecret", "Ip202rSR132zJGKH"); + request1.AddJsonBody(OOO); + var response = client1.Execute(request1); + var content111 = response.Content; + + + + ////string url = "http://face.blv-oa.com/Interface/checkinInterface?key=abc&data={"LodgerNmae":"王悦","IDNumber":"1133397752487743488","Sex":0,"picture":"http://pms.boonlive-rcu.com:89/pic/1133397752487743488_1384391.jpg","HotelCode":"2079","roomid":"1906","phonenumber":"19847388255","CheckTime":"2025-06-20 11:19:04","pmsinfoid":1905524}"; + //string url = File.ReadAllText("2.txt"); + //var NNN1= JsonConvert.DeserializeObject(url); + + //return; + //var client1 = new RestClient(url); + //var request1 = new RestRequest(Method.POST); + //request1.AddJsonBody(null); + //var Response = client1.Execute(request1).Content; + //content = Response; + + //string result = string.Empty; + //HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url); + //req.ContentType = "application/json"; + //req.Method = "POST"; + ////req.Timeout = 10000;//设置请求超时时间,单位为毫秒 + //byte[] data = Encoding.UTF8.GetBytes(""); + //req.ContentLength = data.Length; + //using (Stream reqStream = req.GetRequestStream()) + //{ + // reqStream.Write(data, 0, data.Length); + //} + //HttpWebResponse resp = (HttpWebResponse)req.GetResponse(); + //using (Stream stream = resp.GetResponseStream()) + //{ + // using (StreamReader reader = new StreamReader(stream, Encoding.UTF8)) + // { + // result = reader.ReadToEnd();//获取响应内容 + // } + //} + + } + catch (Exception ex) + { + } + Console.ReadKey(); + + + string xmlString = File.ReadAllText("1.txt"); + XDocument doc1 = XDocument.Parse(xmlString); + XElement Root = doc1.Root; + string NNN = Root.Attribute("orderno")?.Value; + + var LES = Root.Elements("item"); + foreach (var item in LES) + { + string customer = item.Attribute("customer").Value; + string sex = item.Attribute("sex").Value; + } + + + + //ServiceReference1.blwwsSoapClient c = new ServiceReference1.blwwsSoapClient(); + //c.Test(); + //string token = GetToken_G(); + //Console.WriteLine(token); + //ConcurrentDictionary GlobalData = new ConcurrentDictionary(); + //GlobalData.AddOrUpdate("A", token, (k, v) => { return token; }); + //GlobalData.AddOrUpdate("A", token, (k, v) => { return token; }); + //GlobalData.AddOrUpdate("A", token, (k, v) => { return token; }); + //GlobalData.AddOrUpdate("A", token, (k, v) => { return token; }); + Console.ReadKey(); + } + + static public string UserCode = "KKJK"; + static public string UserKey = "KKJK0428"; + static public string BaseUrl = "https://armitage-ipms.shijicloud.com"; + public static string GetToken_G() + { + Dictionary Params = new Dictionary(); + Params.Add("userCode", UserCode); + Params.Add("key", UserKey); + + var tokenstr = Send_Http_Request_Params("/iPMSAPI/iPMSApiService/api/applySecurityToken", Params); + + Console.WriteLine(tokenstr); + if (!string.IsNullOrEmpty(tokenstr)) + { + var dic = JsonConvert.DeserializeObject>(tokenstr); + string token = dic["securityToken"]; + return token; + } + return ""; + } + + public static string Send_Http_Request_Params(string Url, Dictionary Params) + { + var client1 = new RestClient(BaseUrl); + var request1 = new RestRequest(Url, Method.POST); + + foreach (KeyValuePair item in Params) + { + request1.AddParameter(item.Key, item.Value); + } + + var response = client1.Execute(request1); + var content = response.Content; + return content; + } + + + public static string queueName2 = @".\private$\faceServerToWeb"; + public static MessageQueue mq2 = null; + + + + /// + /// 从消息队列中读取命令,并执行 + /// + public static void ReceiveCmdLoop() + { + while (true) + { + try + { + //判断队列是否存在 + if (MessageQueue.Exists(queueName2)) + { + mq2 = new MessageQueue(queueName2); + } + else + { + //创建队列 + mq2 = MessageQueue.Create(queueName2); + } + //给管理员队列权力 + mq2.SetPermissions("Administrator", MessageQueueAccessRights.FullControl); + //匿名登录 + mq2.SetPermissions("ANONYMOUS LOGON", MessageQueueAccessRights.FullControl); + mq2.SetPermissions("Everyone", MessageQueueAccessRights.FullControl); + + while (true) + { + Message msgRx = mq2.Receive(); + msgRx.Formatter = new XmlMessageFormatter(new Type[] { typeof(string) }); + + string strRx = msgRx.Body.ToString(); + + + Thread.Sleep(1300); //阻塞当前线程1秒,让其他线程运行 + } + } + catch (Exception ex) + { + Thread.Sleep(5000); //阻塞当前线程5秒,再重新启动 + continue; + } + } + } + + /// + /// 向消息队列中发送消息 + /// + /// 消息 + /// + public static string QueueSend(string sendMsg) + { + try + { + if (mq2 == null) + { + if (MessageQueue.Exists(queueName2)) + { + mq2 = new MessageQueue(queueName2); + } + else + { + mq2 = MessageQueue.Create(queueName2); + } + mq2.SetPermissions("Administrator", MessageQueueAccessRights.FullControl); + mq2.SetPermissions("ANONYMOUS LOGON", MessageQueueAccessRights.FullControl); + mq2.SetPermissions("Everyone", MessageQueueAccessRights.FullControl); + } + + Message msgTx = new Message + { + Body = "", + Formatter = new XmlMessageFormatter(new Type[] { typeof(string) }) + }; + mq2.Send(msgTx); + return "Succeed push msg to MQ !"; + } + catch (Exception ex) + { + mq2 = null; + return ex.ToString(); + } + } +} + diff --git a/ConsoleApp1/Properties/AssemblyInfo.cs b/ConsoleApp1/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..87eecb3 --- /dev/null +++ b/ConsoleApp1/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("ConsoleApp1")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("ConsoleApp1")] +[assembly: AssemblyCopyright("Copyright © 2025")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 会使此程序集中的类型 +//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("ceee2228-3250-4886-aecf-ab66211c41e6")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/ConsoleApp1/packages.config b/ConsoleApp1/packages.config new file mode 100644 index 0000000..2f9e97d --- /dev/null +++ b/ConsoleApp1/packages.config @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/ConsoleApp2/ConsoleApp2.csproj b/ConsoleApp2/ConsoleApp2.csproj new file mode 100644 index 0000000..f6641a5 --- /dev/null +++ b/ConsoleApp2/ConsoleApp2.csproj @@ -0,0 +1,22 @@ + + + + Exe + net8.0 + enable + enable + + + + + + + + + + + C:\Program Files\IIS\Microsoft Web Deploy V3\Newtonsoft.Json.dll + + + + diff --git a/ConsoleApp2/Program.cs b/ConsoleApp2/Program.cs new file mode 100644 index 0000000..825fec7 --- /dev/null +++ b/ConsoleApp2/Program.cs @@ -0,0 +1,64 @@ +using Microsoft.Extensions.DependencyInjection; +using Microsoft.VisualBasic; +using Newtonsoft.Json; +using RestSharp; + +namespace ConsoleApp2 +{ + internal class Program + { + public static System.Timers.Timer timer; + static void Main(string[] args) + { + //ServiceCollection services = new ServiceCollection(); + //string ss0 = File.ReadAllText("1.txt"); + //string ss1 = File.ReadAllText("2.txt"); + //string n = ss0 + ss1; + //Console.WriteLine(n); + timer = new System.Timers.Timer(); + timer.Interval = 60000; + //timer.Interval = 3; + timer.Elapsed += Timer_Elapsed; + timer.Start(); + Console.ReadLine(); + } + + async private static void Timer_Elapsed(object? sender, System.Timers.ElapsedEventArgs e) + { + try + { + Console.WriteLine("发送了请求"); + await Send_Http_Request_Params(BaseUrl, "/Index.aspx", Method.Get); + await Send_Http_Request_Params(BaseUrl1, "/api/Values/HeartCallWake", Method.Post); + + //电话机 + await Send_Http_Request_Params(BaseUrl2, "/Home/Halo", Method.Post); + } + catch (Exception) + { + Console.WriteLine("出错了"); + } + } + + //千里马模拟器 + static public string BaseUrl = "http://localhost:19056"; + + //这台电脑上安装不了.net frameworkd所有不能使用 + //现在 安装在47.119电脑上 + //static public string BaseUrl1 = "http://pms.boonlive-rcu.com:19055"; + + //日志服务器 + static public string BaseUrl1 = "http://localhost:19055"; + static public string BaseUrl2 = "http://blv-rd.tech:19041"; + + public static async Task Send_Http_Request_Params(string BaseUrlstr, string Url, Method M) + { + var client1 = new RestClient(BaseUrlstr); + var request1 = new RestRequest(Url, M); + + var response = await client1.ExecuteAsync(request1); + var content = response.Content; + return content; + } + } +} diff --git a/ConsoleApp3/App.config b/ConsoleApp3/App.config new file mode 100644 index 0000000..613e77f --- /dev/null +++ b/ConsoleApp3/App.config @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ConsoleApp3/ConsoleApp3.csproj b/ConsoleApp3/ConsoleApp3.csproj new file mode 100644 index 0000000..0049dec --- /dev/null +++ b/ConsoleApp3/ConsoleApp3.csproj @@ -0,0 +1,63 @@ + + + + + Debug + AnyCPU + {2E675990-CB6E-41A7-A7EE-7FA2DAA159F6} + Exe + ConsoleApp3 + ConsoleApp3 + v4.8 + 512 + true + true + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll + + + + + + + + + + + + + + + + + + + + + {3d1c2418-8f29-4d2f-b7e9-bdbcd0fe021e} + BLWWS + + + + \ No newline at end of file diff --git a/ConsoleApp3/Program.cs b/ConsoleApp3/Program.cs new file mode 100644 index 0000000..6e1fe44 --- /dev/null +++ b/ConsoleApp3/Program.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using BLWWS; +using Newtonsoft.Json; + +namespace ConsoleApp3 +{ + internal class Program + { + static void Main(string[] args) + { + //string nnn= File.ReadAllText("1.txt",Encoding.UTF8); + + //var QQQ= JsonConvert.DeserializeObject(nnn); + + //var DDD= QQQ.groupOrder.orderItems.Select(A=>A.guests).ToList(); + + } + } +} diff --git a/ConsoleApp3/Properties/AssemblyInfo.cs b/ConsoleApp3/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..81dfba3 --- /dev/null +++ b/ConsoleApp3/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("ConsoleApp3")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("ConsoleApp3")] +[assembly: AssemblyCopyright("Copyright © 2025")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 会使此程序集中的类型 +//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("2e675990-cb6e-41a7-a7ee-7fa2daa159f6")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/ConsoleApp3/packages.config b/ConsoleApp3/packages.config new file mode 100644 index 0000000..0b14af3 --- /dev/null +++ b/ConsoleApp3/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/ConsoleApp4/App.config b/ConsoleApp4/App.config new file mode 100644 index 0000000..4ce87b0 --- /dev/null +++ b/ConsoleApp4/App.config @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ConsoleApp4/Connected Services/ServiceReference1/ConsoleApp4.ServiceReference1.ChangePhoneNumberResponse.datasource b/ConsoleApp4/Connected Services/ServiceReference1/ConsoleApp4.ServiceReference1.ChangePhoneNumberResponse.datasource new file mode 100644 index 0000000..1a15aa1 --- /dev/null +++ b/ConsoleApp4/Connected Services/ServiceReference1/ConsoleApp4.ServiceReference1.ChangePhoneNumberResponse.datasource @@ -0,0 +1,10 @@ + + + + ConsoleApp4.ServiceReference1.ChangePhoneNumberResponse, Connected Services.ServiceReference1.Reference.cs.dll, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + \ No newline at end of file diff --git a/ConsoleApp4/Connected Services/ServiceReference1/ConsoleApp4.ServiceReference1.CheckIn2Response.datasource b/ConsoleApp4/Connected Services/ServiceReference1/ConsoleApp4.ServiceReference1.CheckIn2Response.datasource new file mode 100644 index 0000000..4972090 --- /dev/null +++ b/ConsoleApp4/Connected Services/ServiceReference1/ConsoleApp4.ServiceReference1.CheckIn2Response.datasource @@ -0,0 +1,10 @@ + + + + ConsoleApp4.ServiceReference1.CheckIn2Response, Connected Services.ServiceReference1.Reference.cs.dll, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + \ No newline at end of file diff --git a/ConsoleApp4/Connected Services/ServiceReference1/ConsoleApp4.ServiceReference1.CheckInResponse.datasource b/ConsoleApp4/Connected Services/ServiceReference1/ConsoleApp4.ServiceReference1.CheckInResponse.datasource new file mode 100644 index 0000000..3b675f7 --- /dev/null +++ b/ConsoleApp4/Connected Services/ServiceReference1/ConsoleApp4.ServiceReference1.CheckInResponse.datasource @@ -0,0 +1,10 @@ + + + + ConsoleApp4.ServiceReference1.CheckInResponse, Connected Services.ServiceReference1.Reference.cs.dll, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + \ No newline at end of file diff --git a/ConsoleApp4/Connected Services/ServiceReference1/ConsoleApp4.ServiceReference1.CheckOutResponse.datasource b/ConsoleApp4/Connected Services/ServiceReference1/ConsoleApp4.ServiceReference1.CheckOutResponse.datasource new file mode 100644 index 0000000..227005e --- /dev/null +++ b/ConsoleApp4/Connected Services/ServiceReference1/ConsoleApp4.ServiceReference1.CheckOutResponse.datasource @@ -0,0 +1,10 @@ + + + + ConsoleApp4.ServiceReference1.CheckOutResponse, Connected Services.ServiceReference1.Reference.cs.dll, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + \ No newline at end of file diff --git a/ConsoleApp4/Connected Services/ServiceReference1/ConsoleApp4.ServiceReference1.RentRoomResponse.datasource b/ConsoleApp4/Connected Services/ServiceReference1/ConsoleApp4.ServiceReference1.RentRoomResponse.datasource new file mode 100644 index 0000000..366ebfd --- /dev/null +++ b/ConsoleApp4/Connected Services/ServiceReference1/ConsoleApp4.ServiceReference1.RentRoomResponse.datasource @@ -0,0 +1,10 @@ + + + + ConsoleApp4.ServiceReference1.RentRoomResponse, Connected Services.ServiceReference1.Reference.cs.dll, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + \ No newline at end of file diff --git a/ConsoleApp4/Connected Services/ServiceReference1/ConsoleApp4.ServiceReference1.UploadPhotoResponse.datasource b/ConsoleApp4/Connected Services/ServiceReference1/ConsoleApp4.ServiceReference1.UploadPhotoResponse.datasource new file mode 100644 index 0000000..b4c6889 --- /dev/null +++ b/ConsoleApp4/Connected Services/ServiceReference1/ConsoleApp4.ServiceReference1.UploadPhotoResponse.datasource @@ -0,0 +1,10 @@ + + + + ConsoleApp4.ServiceReference1.UploadPhotoResponse, Connected Services.ServiceReference1.Reference.cs.dll, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + \ No newline at end of file diff --git a/ConsoleApp4/Connected Services/ServiceReference1/Reference.cs b/ConsoleApp4/Connected Services/ServiceReference1/Reference.cs new file mode 100644 index 0000000..299b436 --- /dev/null +++ b/ConsoleApp4/Connected Services/ServiceReference1/Reference.cs @@ -0,0 +1,879 @@ +//------------------------------------------------------------------------------ +// +// 此代码由工具生成。 +// 运行时版本:4.0.30319.42000 +// +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 +// +//------------------------------------------------------------------------------ + +namespace ConsoleApp4.ServiceReference1 { + + + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + [System.ServiceModel.ServiceContractAttribute(Namespace="http://www.blw.com/", ConfigurationName="ServiceReference1.blwwsSoap")] + public interface blwwsSoap { + + [System.ServiceModel.OperationContractAttribute(Action="http://www.blw.com/CheckIn", ReplyAction="*")] + ConsoleApp4.ServiceReference1.CheckInResponse CheckIn(ConsoleApp4.ServiceReference1.CheckInRequest request); + + [System.ServiceModel.OperationContractAttribute(Action="http://www.blw.com/CheckIn", ReplyAction="*")] + System.Threading.Tasks.Task CheckInAsync(ConsoleApp4.ServiceReference1.CheckInRequest request); + + [System.ServiceModel.OperationContractAttribute(Action="http://www.blw.com/CheckIn2", ReplyAction="*")] + ConsoleApp4.ServiceReference1.CheckIn2Response CheckIn2(ConsoleApp4.ServiceReference1.CheckIn2Request request); + + [System.ServiceModel.OperationContractAttribute(Action="http://www.blw.com/CheckIn2", ReplyAction="*")] + System.Threading.Tasks.Task CheckIn2Async(ConsoleApp4.ServiceReference1.CheckIn2Request request); + + [System.ServiceModel.OperationContractAttribute(Action="http://www.blw.com/UploadPhoto", ReplyAction="*")] + ConsoleApp4.ServiceReference1.UploadPhotoResponse UploadPhoto(ConsoleApp4.ServiceReference1.UploadPhotoRequest request); + + [System.ServiceModel.OperationContractAttribute(Action="http://www.blw.com/UploadPhoto", ReplyAction="*")] + System.Threading.Tasks.Task UploadPhotoAsync(ConsoleApp4.ServiceReference1.UploadPhotoRequest request); + + [System.ServiceModel.OperationContractAttribute(Action="http://www.blw.com/ChangePhoneNumber", ReplyAction="*")] + ConsoleApp4.ServiceReference1.ChangePhoneNumberResponse ChangePhoneNumber(ConsoleApp4.ServiceReference1.ChangePhoneNumberRequest request); + + [System.ServiceModel.OperationContractAttribute(Action="http://www.blw.com/ChangePhoneNumber", ReplyAction="*")] + System.Threading.Tasks.Task ChangePhoneNumberAsync(ConsoleApp4.ServiceReference1.ChangePhoneNumberRequest request); + + [System.ServiceModel.OperationContractAttribute(Action="http://www.blw.com/CheckOut", ReplyAction="*")] + ConsoleApp4.ServiceReference1.CheckOutResponse CheckOut(ConsoleApp4.ServiceReference1.CheckOutRequest request); + + [System.ServiceModel.OperationContractAttribute(Action="http://www.blw.com/CheckOut", ReplyAction="*")] + System.Threading.Tasks.Task CheckOutAsync(ConsoleApp4.ServiceReference1.CheckOutRequest request); + + [System.ServiceModel.OperationContractAttribute(Action="http://www.blw.com/RentRoom", ReplyAction="*")] + ConsoleApp4.ServiceReference1.RentRoomResponse RentRoom(ConsoleApp4.ServiceReference1.RentRoomRequest request); + + [System.ServiceModel.OperationContractAttribute(Action="http://www.blw.com/RentRoom", ReplyAction="*")] + System.Threading.Tasks.Task RentRoomAsync(ConsoleApp4.ServiceReference1.RentRoomRequest request); + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + [System.ServiceModel.MessageContractAttribute(IsWrapped=false)] + public partial class CheckInRequest { + + [System.ServiceModel.MessageBodyMemberAttribute(Name="CheckIn", Namespace="http://www.blw.com/", Order=0)] + public ConsoleApp4.ServiceReference1.CheckInRequestBody Body; + + public CheckInRequest() { + } + + public CheckInRequest(ConsoleApp4.ServiceReference1.CheckInRequestBody Body) { + this.Body = Body; + } + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + [System.Runtime.Serialization.DataContractAttribute(Namespace="http://www.blw.com/")] + public partial class CheckInRequestBody { + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=0)] + public string key; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=1)] + public string code; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=2)] + public string roomNumber; + + [System.Runtime.Serialization.DataMemberAttribute(Order=3)] + public System.DateTime checkInDate; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=4)] + public string xmlString; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=5)] + public string errorMsg; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=6)] + public string phoneNumber; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=7)] + public string idNumber; + + public CheckInRequestBody() { + } + + public CheckInRequestBody(string key, string code, string roomNumber, System.DateTime checkInDate, string xmlString, string errorMsg, string phoneNumber, string idNumber) { + this.key = key; + this.code = code; + this.roomNumber = roomNumber; + this.checkInDate = checkInDate; + this.xmlString = xmlString; + this.errorMsg = errorMsg; + this.phoneNumber = phoneNumber; + this.idNumber = idNumber; + } + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + [System.ServiceModel.MessageContractAttribute(IsWrapped=false)] + public partial class CheckInResponse { + + [System.ServiceModel.MessageBodyMemberAttribute(Name="CheckInResponse", Namespace="http://www.blw.com/", Order=0)] + public ConsoleApp4.ServiceReference1.CheckInResponseBody Body; + + public CheckInResponse() { + } + + public CheckInResponse(ConsoleApp4.ServiceReference1.CheckInResponseBody Body) { + this.Body = Body; + } + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + [System.Runtime.Serialization.DataContractAttribute(Namespace="http://www.blw.com/")] + public partial class CheckInResponseBody { + + [System.Runtime.Serialization.DataMemberAttribute(Order=0)] + public bool CheckInResult; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=1)] + public string errorMsg; + + public CheckInResponseBody() { + } + + public CheckInResponseBody(bool CheckInResult, string errorMsg) { + this.CheckInResult = CheckInResult; + this.errorMsg = errorMsg; + } + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + [System.ServiceModel.MessageContractAttribute(IsWrapped=false)] + public partial class CheckIn2Request { + + [System.ServiceModel.MessageBodyMemberAttribute(Name="CheckIn2", Namespace="http://www.blw.com/", Order=0)] + public ConsoleApp4.ServiceReference1.CheckIn2RequestBody Body; + + public CheckIn2Request() { + } + + public CheckIn2Request(ConsoleApp4.ServiceReference1.CheckIn2RequestBody Body) { + this.Body = Body; + } + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + [System.Runtime.Serialization.DataContractAttribute(Namespace="http://www.blw.com/")] + public partial class CheckIn2RequestBody { + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=0)] + public string key; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=1)] + public string code; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=2)] + public string roomNumber; + + [System.Runtime.Serialization.DataMemberAttribute(Order=3)] + public System.DateTime checkInDate; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=4)] + public string xmlString; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=5)] + public string errorMsg; + + [System.Runtime.Serialization.DataMemberAttribute(Order=6)] + public long checkInID; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=7)] + public string phoneNumber; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=8)] + public string idNumber; + + public CheckIn2RequestBody() { + } + + public CheckIn2RequestBody(string key, string code, string roomNumber, System.DateTime checkInDate, string xmlString, string errorMsg, long checkInID, string phoneNumber, string idNumber) { + this.key = key; + this.code = code; + this.roomNumber = roomNumber; + this.checkInDate = checkInDate; + this.xmlString = xmlString; + this.errorMsg = errorMsg; + this.checkInID = checkInID; + this.phoneNumber = phoneNumber; + this.idNumber = idNumber; + } + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + [System.ServiceModel.MessageContractAttribute(IsWrapped=false)] + public partial class CheckIn2Response { + + [System.ServiceModel.MessageBodyMemberAttribute(Name="CheckIn2Response", Namespace="http://www.blw.com/", Order=0)] + public ConsoleApp4.ServiceReference1.CheckIn2ResponseBody Body; + + public CheckIn2Response() { + } + + public CheckIn2Response(ConsoleApp4.ServiceReference1.CheckIn2ResponseBody Body) { + this.Body = Body; + } + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + [System.Runtime.Serialization.DataContractAttribute(Namespace="http://www.blw.com/")] + public partial class CheckIn2ResponseBody { + + [System.Runtime.Serialization.DataMemberAttribute(Order=0)] + public bool CheckIn2Result; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=1)] + public string errorMsg; + + [System.Runtime.Serialization.DataMemberAttribute(Order=2)] + public long checkInID; + + public CheckIn2ResponseBody() { + } + + public CheckIn2ResponseBody(bool CheckIn2Result, string errorMsg, long checkInID) { + this.CheckIn2Result = CheckIn2Result; + this.errorMsg = errorMsg; + this.checkInID = checkInID; + } + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + [System.ServiceModel.MessageContractAttribute(IsWrapped=false)] + public partial class UploadPhotoRequest { + + [System.ServiceModel.MessageBodyMemberAttribute(Name="UploadPhoto", Namespace="http://www.blw.com/", Order=0)] + public ConsoleApp4.ServiceReference1.UploadPhotoRequestBody Body; + + public UploadPhotoRequest() { + } + + public UploadPhotoRequest(ConsoleApp4.ServiceReference1.UploadPhotoRequestBody Body) { + this.Body = Body; + } + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + [System.Runtime.Serialization.DataContractAttribute(Namespace="http://www.blw.com/")] + public partial class UploadPhotoRequestBody { + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=0)] + public string key; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=1)] + public string code; + + [System.Runtime.Serialization.DataMemberAttribute(Order=2)] + public long checkInID; + + [System.Runtime.Serialization.DataMemberAttribute(Order=3)] + public int idType; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=4)] + public string idCard; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=5)] + public string name; + + [System.Runtime.Serialization.DataMemberAttribute(Order=6)] + public int sex; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=7)] + public string birthday; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=8)] + public string photoUrl; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=9)] + public byte[] photo; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=10)] + public string errorMsg; + + public UploadPhotoRequestBody() { + } + + public UploadPhotoRequestBody(string key, string code, long checkInID, int idType, string idCard, string name, int sex, string birthday, string photoUrl, byte[] photo, string errorMsg) { + this.key = key; + this.code = code; + this.checkInID = checkInID; + this.idType = idType; + this.idCard = idCard; + this.name = name; + this.sex = sex; + this.birthday = birthday; + this.photoUrl = photoUrl; + this.photo = photo; + this.errorMsg = errorMsg; + } + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + [System.ServiceModel.MessageContractAttribute(IsWrapped=false)] + public partial class UploadPhotoResponse { + + [System.ServiceModel.MessageBodyMemberAttribute(Name="UploadPhotoResponse", Namespace="http://www.blw.com/", Order=0)] + public ConsoleApp4.ServiceReference1.UploadPhotoResponseBody Body; + + public UploadPhotoResponse() { + } + + public UploadPhotoResponse(ConsoleApp4.ServiceReference1.UploadPhotoResponseBody Body) { + this.Body = Body; + } + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + [System.Runtime.Serialization.DataContractAttribute(Namespace="http://www.blw.com/")] + public partial class UploadPhotoResponseBody { + + [System.Runtime.Serialization.DataMemberAttribute(Order=0)] + public bool UploadPhotoResult; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=1)] + public string errorMsg; + + public UploadPhotoResponseBody() { + } + + public UploadPhotoResponseBody(bool UploadPhotoResult, string errorMsg) { + this.UploadPhotoResult = UploadPhotoResult; + this.errorMsg = errorMsg; + } + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + [System.ServiceModel.MessageContractAttribute(IsWrapped=false)] + public partial class ChangePhoneNumberRequest { + + [System.ServiceModel.MessageBodyMemberAttribute(Name="ChangePhoneNumber", Namespace="http://www.blw.com/", Order=0)] + public ConsoleApp4.ServiceReference1.ChangePhoneNumberRequestBody Body; + + public ChangePhoneNumberRequest() { + } + + public ChangePhoneNumberRequest(ConsoleApp4.ServiceReference1.ChangePhoneNumberRequestBody Body) { + this.Body = Body; + } + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + [System.Runtime.Serialization.DataContractAttribute(Namespace="http://www.blw.com/")] + public partial class ChangePhoneNumberRequestBody { + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=0)] + public string key; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=1)] + public string code; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=2)] + public string roomNumber; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=3)] + public string phoneNumber; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=4)] + public string idNumber; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=5)] + public string errorMsg; + + public ChangePhoneNumberRequestBody() { + } + + public ChangePhoneNumberRequestBody(string key, string code, string roomNumber, string phoneNumber, string idNumber, string errorMsg) { + this.key = key; + this.code = code; + this.roomNumber = roomNumber; + this.phoneNumber = phoneNumber; + this.idNumber = idNumber; + this.errorMsg = errorMsg; + } + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + [System.ServiceModel.MessageContractAttribute(IsWrapped=false)] + public partial class ChangePhoneNumberResponse { + + [System.ServiceModel.MessageBodyMemberAttribute(Name="ChangePhoneNumberResponse", Namespace="http://www.blw.com/", Order=0)] + public ConsoleApp4.ServiceReference1.ChangePhoneNumberResponseBody Body; + + public ChangePhoneNumberResponse() { + } + + public ChangePhoneNumberResponse(ConsoleApp4.ServiceReference1.ChangePhoneNumberResponseBody Body) { + this.Body = Body; + } + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + [System.Runtime.Serialization.DataContractAttribute(Namespace="http://www.blw.com/")] + public partial class ChangePhoneNumberResponseBody { + + [System.Runtime.Serialization.DataMemberAttribute(Order=0)] + public bool ChangePhoneNumberResult; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=1)] + public string errorMsg; + + public ChangePhoneNumberResponseBody() { + } + + public ChangePhoneNumberResponseBody(bool ChangePhoneNumberResult, string errorMsg) { + this.ChangePhoneNumberResult = ChangePhoneNumberResult; + this.errorMsg = errorMsg; + } + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + [System.ServiceModel.MessageContractAttribute(IsWrapped=false)] + public partial class CheckOutRequest { + + [System.ServiceModel.MessageBodyMemberAttribute(Name="CheckOut", Namespace="http://www.blw.com/", Order=0)] + public ConsoleApp4.ServiceReference1.CheckOutRequestBody Body; + + public CheckOutRequest() { + } + + public CheckOutRequest(ConsoleApp4.ServiceReference1.CheckOutRequestBody Body) { + this.Body = Body; + } + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + [System.Runtime.Serialization.DataContractAttribute(Namespace="http://www.blw.com/")] + public partial class CheckOutRequestBody { + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=0)] + public string key; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=1)] + public string code; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=2)] + public string roomNumber; + + [System.Runtime.Serialization.DataMemberAttribute(Order=3)] + public System.DateTime checkOutDate; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=4)] + public string errorMsg; + + public CheckOutRequestBody() { + } + + public CheckOutRequestBody(string key, string code, string roomNumber, System.DateTime checkOutDate, string errorMsg) { + this.key = key; + this.code = code; + this.roomNumber = roomNumber; + this.checkOutDate = checkOutDate; + this.errorMsg = errorMsg; + } + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + [System.ServiceModel.MessageContractAttribute(IsWrapped=false)] + public partial class CheckOutResponse { + + [System.ServiceModel.MessageBodyMemberAttribute(Name="CheckOutResponse", Namespace="http://www.blw.com/", Order=0)] + public ConsoleApp4.ServiceReference1.CheckOutResponseBody Body; + + public CheckOutResponse() { + } + + public CheckOutResponse(ConsoleApp4.ServiceReference1.CheckOutResponseBody Body) { + this.Body = Body; + } + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + [System.Runtime.Serialization.DataContractAttribute(Namespace="http://www.blw.com/")] + public partial class CheckOutResponseBody { + + [System.Runtime.Serialization.DataMemberAttribute(Order=0)] + public bool CheckOutResult; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=1)] + public string errorMsg; + + public CheckOutResponseBody() { + } + + public CheckOutResponseBody(bool CheckOutResult, string errorMsg) { + this.CheckOutResult = CheckOutResult; + this.errorMsg = errorMsg; + } + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + [System.ServiceModel.MessageContractAttribute(IsWrapped=false)] + public partial class RentRoomRequest { + + [System.ServiceModel.MessageBodyMemberAttribute(Name="RentRoom", Namespace="http://www.blw.com/", Order=0)] + public ConsoleApp4.ServiceReference1.RentRoomRequestBody Body; + + public RentRoomRequest() { + } + + public RentRoomRequest(ConsoleApp4.ServiceReference1.RentRoomRequestBody Body) { + this.Body = Body; + } + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + [System.Runtime.Serialization.DataContractAttribute(Namespace="http://www.blw.com/")] + public partial class RentRoomRequestBody { + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=0)] + public string key; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=1)] + public string code; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=2)] + public string roomNumber; + + [System.Runtime.Serialization.DataMemberAttribute(Order=3)] + public System.DateTime rentDate; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=4)] + public string errorMsg; + + public RentRoomRequestBody() { + } + + public RentRoomRequestBody(string key, string code, string roomNumber, System.DateTime rentDate, string errorMsg) { + this.key = key; + this.code = code; + this.roomNumber = roomNumber; + this.rentDate = rentDate; + this.errorMsg = errorMsg; + } + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + [System.ServiceModel.MessageContractAttribute(IsWrapped=false)] + public partial class RentRoomResponse { + + [System.ServiceModel.MessageBodyMemberAttribute(Name="RentRoomResponse", Namespace="http://www.blw.com/", Order=0)] + public ConsoleApp4.ServiceReference1.RentRoomResponseBody Body; + + public RentRoomResponse() { + } + + public RentRoomResponse(ConsoleApp4.ServiceReference1.RentRoomResponseBody Body) { + this.Body = Body; + } + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + [System.Runtime.Serialization.DataContractAttribute(Namespace="http://www.blw.com/")] + public partial class RentRoomResponseBody { + + [System.Runtime.Serialization.DataMemberAttribute(Order=0)] + public bool RentRoomResult; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=1)] + public string errorMsg; + + public RentRoomResponseBody() { + } + + public RentRoomResponseBody(bool RentRoomResult, string errorMsg) { + this.RentRoomResult = RentRoomResult; + this.errorMsg = errorMsg; + } + } + + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + public interface blwwsSoapChannel : ConsoleApp4.ServiceReference1.blwwsSoap, System.ServiceModel.IClientChannel { + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + public partial class blwwsSoapClient : System.ServiceModel.ClientBase, ConsoleApp4.ServiceReference1.blwwsSoap { + + public blwwsSoapClient() { + } + + public blwwsSoapClient(string endpointConfigurationName) : + base(endpointConfigurationName) { + } + + public blwwsSoapClient(string endpointConfigurationName, string remoteAddress) : + base(endpointConfigurationName, remoteAddress) { + } + + public blwwsSoapClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) : + base(endpointConfigurationName, remoteAddress) { + } + + public blwwsSoapClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) : + base(binding, remoteAddress) { + } + + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + ConsoleApp4.ServiceReference1.CheckInResponse ConsoleApp4.ServiceReference1.blwwsSoap.CheckIn(ConsoleApp4.ServiceReference1.CheckInRequest request) { + return base.Channel.CheckIn(request); + } + + public bool CheckIn(string key, string code, string roomNumber, System.DateTime checkInDate, string xmlString, ref string errorMsg, string phoneNumber, string idNumber) { + ConsoleApp4.ServiceReference1.CheckInRequest inValue = new ConsoleApp4.ServiceReference1.CheckInRequest(); + inValue.Body = new ConsoleApp4.ServiceReference1.CheckInRequestBody(); + inValue.Body.key = key; + inValue.Body.code = code; + inValue.Body.roomNumber = roomNumber; + inValue.Body.checkInDate = checkInDate; + inValue.Body.xmlString = xmlString; + inValue.Body.errorMsg = errorMsg; + inValue.Body.phoneNumber = phoneNumber; + inValue.Body.idNumber = idNumber; + ConsoleApp4.ServiceReference1.CheckInResponse retVal = ((ConsoleApp4.ServiceReference1.blwwsSoap)(this)).CheckIn(inValue); + errorMsg = retVal.Body.errorMsg; + return retVal.Body.CheckInResult; + } + + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + System.Threading.Tasks.Task ConsoleApp4.ServiceReference1.blwwsSoap.CheckInAsync(ConsoleApp4.ServiceReference1.CheckInRequest request) { + return base.Channel.CheckInAsync(request); + } + + public System.Threading.Tasks.Task CheckInAsync(string key, string code, string roomNumber, System.DateTime checkInDate, string xmlString, string errorMsg, string phoneNumber, string idNumber) { + ConsoleApp4.ServiceReference1.CheckInRequest inValue = new ConsoleApp4.ServiceReference1.CheckInRequest(); + inValue.Body = new ConsoleApp4.ServiceReference1.CheckInRequestBody(); + inValue.Body.key = key; + inValue.Body.code = code; + inValue.Body.roomNumber = roomNumber; + inValue.Body.checkInDate = checkInDate; + inValue.Body.xmlString = xmlString; + inValue.Body.errorMsg = errorMsg; + inValue.Body.phoneNumber = phoneNumber; + inValue.Body.idNumber = idNumber; + return ((ConsoleApp4.ServiceReference1.blwwsSoap)(this)).CheckInAsync(inValue); + } + + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + ConsoleApp4.ServiceReference1.CheckIn2Response ConsoleApp4.ServiceReference1.blwwsSoap.CheckIn2(ConsoleApp4.ServiceReference1.CheckIn2Request request) { + return base.Channel.CheckIn2(request); + } + + public bool CheckIn2(string key, string code, string roomNumber, System.DateTime checkInDate, string xmlString, ref string errorMsg, ref long checkInID, string phoneNumber, string idNumber) { + ConsoleApp4.ServiceReference1.CheckIn2Request inValue = new ConsoleApp4.ServiceReference1.CheckIn2Request(); + inValue.Body = new ConsoleApp4.ServiceReference1.CheckIn2RequestBody(); + inValue.Body.key = key; + inValue.Body.code = code; + inValue.Body.roomNumber = roomNumber; + inValue.Body.checkInDate = checkInDate; + inValue.Body.xmlString = xmlString; + inValue.Body.errorMsg = errorMsg; + inValue.Body.checkInID = checkInID; + inValue.Body.phoneNumber = phoneNumber; + inValue.Body.idNumber = idNumber; + ConsoleApp4.ServiceReference1.CheckIn2Response retVal = ((ConsoleApp4.ServiceReference1.blwwsSoap)(this)).CheckIn2(inValue); + errorMsg = retVal.Body.errorMsg; + checkInID = retVal.Body.checkInID; + return retVal.Body.CheckIn2Result; + } + + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + System.Threading.Tasks.Task ConsoleApp4.ServiceReference1.blwwsSoap.CheckIn2Async(ConsoleApp4.ServiceReference1.CheckIn2Request request) { + return base.Channel.CheckIn2Async(request); + } + + public System.Threading.Tasks.Task CheckIn2Async(string key, string code, string roomNumber, System.DateTime checkInDate, string xmlString, string errorMsg, long checkInID, string phoneNumber, string idNumber) { + ConsoleApp4.ServiceReference1.CheckIn2Request inValue = new ConsoleApp4.ServiceReference1.CheckIn2Request(); + inValue.Body = new ConsoleApp4.ServiceReference1.CheckIn2RequestBody(); + inValue.Body.key = key; + inValue.Body.code = code; + inValue.Body.roomNumber = roomNumber; + inValue.Body.checkInDate = checkInDate; + inValue.Body.xmlString = xmlString; + inValue.Body.errorMsg = errorMsg; + inValue.Body.checkInID = checkInID; + inValue.Body.phoneNumber = phoneNumber; + inValue.Body.idNumber = idNumber; + return ((ConsoleApp4.ServiceReference1.blwwsSoap)(this)).CheckIn2Async(inValue); + } + + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + ConsoleApp4.ServiceReference1.UploadPhotoResponse ConsoleApp4.ServiceReference1.blwwsSoap.UploadPhoto(ConsoleApp4.ServiceReference1.UploadPhotoRequest request) { + return base.Channel.UploadPhoto(request); + } + + public bool UploadPhoto(string key, string code, long checkInID, int idType, string idCard, string name, int sex, string birthday, string photoUrl, byte[] photo, ref string errorMsg) { + ConsoleApp4.ServiceReference1.UploadPhotoRequest inValue = new ConsoleApp4.ServiceReference1.UploadPhotoRequest(); + inValue.Body = new ConsoleApp4.ServiceReference1.UploadPhotoRequestBody(); + inValue.Body.key = key; + inValue.Body.code = code; + inValue.Body.checkInID = checkInID; + inValue.Body.idType = idType; + inValue.Body.idCard = idCard; + inValue.Body.name = name; + inValue.Body.sex = sex; + inValue.Body.birthday = birthday; + inValue.Body.photoUrl = photoUrl; + inValue.Body.photo = photo; + inValue.Body.errorMsg = errorMsg; + ConsoleApp4.ServiceReference1.UploadPhotoResponse retVal = ((ConsoleApp4.ServiceReference1.blwwsSoap)(this)).UploadPhoto(inValue); + errorMsg = retVal.Body.errorMsg; + return retVal.Body.UploadPhotoResult; + } + + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + System.Threading.Tasks.Task ConsoleApp4.ServiceReference1.blwwsSoap.UploadPhotoAsync(ConsoleApp4.ServiceReference1.UploadPhotoRequest request) { + return base.Channel.UploadPhotoAsync(request); + } + + public System.Threading.Tasks.Task UploadPhotoAsync(string key, string code, long checkInID, int idType, string idCard, string name, int sex, string birthday, string photoUrl, byte[] photo, string errorMsg) { + ConsoleApp4.ServiceReference1.UploadPhotoRequest inValue = new ConsoleApp4.ServiceReference1.UploadPhotoRequest(); + inValue.Body = new ConsoleApp4.ServiceReference1.UploadPhotoRequestBody(); + inValue.Body.key = key; + inValue.Body.code = code; + inValue.Body.checkInID = checkInID; + inValue.Body.idType = idType; + inValue.Body.idCard = idCard; + inValue.Body.name = name; + inValue.Body.sex = sex; + inValue.Body.birthday = birthday; + inValue.Body.photoUrl = photoUrl; + inValue.Body.photo = photo; + inValue.Body.errorMsg = errorMsg; + return ((ConsoleApp4.ServiceReference1.blwwsSoap)(this)).UploadPhotoAsync(inValue); + } + + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + ConsoleApp4.ServiceReference1.ChangePhoneNumberResponse ConsoleApp4.ServiceReference1.blwwsSoap.ChangePhoneNumber(ConsoleApp4.ServiceReference1.ChangePhoneNumberRequest request) { + return base.Channel.ChangePhoneNumber(request); + } + + public bool ChangePhoneNumber(string key, string code, string roomNumber, string phoneNumber, string idNumber, ref string errorMsg) { + ConsoleApp4.ServiceReference1.ChangePhoneNumberRequest inValue = new ConsoleApp4.ServiceReference1.ChangePhoneNumberRequest(); + inValue.Body = new ConsoleApp4.ServiceReference1.ChangePhoneNumberRequestBody(); + inValue.Body.key = key; + inValue.Body.code = code; + inValue.Body.roomNumber = roomNumber; + inValue.Body.phoneNumber = phoneNumber; + inValue.Body.idNumber = idNumber; + inValue.Body.errorMsg = errorMsg; + ConsoleApp4.ServiceReference1.ChangePhoneNumberResponse retVal = ((ConsoleApp4.ServiceReference1.blwwsSoap)(this)).ChangePhoneNumber(inValue); + errorMsg = retVal.Body.errorMsg; + return retVal.Body.ChangePhoneNumberResult; + } + + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + System.Threading.Tasks.Task ConsoleApp4.ServiceReference1.blwwsSoap.ChangePhoneNumberAsync(ConsoleApp4.ServiceReference1.ChangePhoneNumberRequest request) { + return base.Channel.ChangePhoneNumberAsync(request); + } + + public System.Threading.Tasks.Task ChangePhoneNumberAsync(string key, string code, string roomNumber, string phoneNumber, string idNumber, string errorMsg) { + ConsoleApp4.ServiceReference1.ChangePhoneNumberRequest inValue = new ConsoleApp4.ServiceReference1.ChangePhoneNumberRequest(); + inValue.Body = new ConsoleApp4.ServiceReference1.ChangePhoneNumberRequestBody(); + inValue.Body.key = key; + inValue.Body.code = code; + inValue.Body.roomNumber = roomNumber; + inValue.Body.phoneNumber = phoneNumber; + inValue.Body.idNumber = idNumber; + inValue.Body.errorMsg = errorMsg; + return ((ConsoleApp4.ServiceReference1.blwwsSoap)(this)).ChangePhoneNumberAsync(inValue); + } + + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + ConsoleApp4.ServiceReference1.CheckOutResponse ConsoleApp4.ServiceReference1.blwwsSoap.CheckOut(ConsoleApp4.ServiceReference1.CheckOutRequest request) { + return base.Channel.CheckOut(request); + } + + public bool CheckOut(string key, string code, string roomNumber, System.DateTime checkOutDate, ref string errorMsg) { + ConsoleApp4.ServiceReference1.CheckOutRequest inValue = new ConsoleApp4.ServiceReference1.CheckOutRequest(); + inValue.Body = new ConsoleApp4.ServiceReference1.CheckOutRequestBody(); + inValue.Body.key = key; + inValue.Body.code = code; + inValue.Body.roomNumber = roomNumber; + inValue.Body.checkOutDate = checkOutDate; + inValue.Body.errorMsg = errorMsg; + ConsoleApp4.ServiceReference1.CheckOutResponse retVal = ((ConsoleApp4.ServiceReference1.blwwsSoap)(this)).CheckOut(inValue); + errorMsg = retVal.Body.errorMsg; + return retVal.Body.CheckOutResult; + } + + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + System.Threading.Tasks.Task ConsoleApp4.ServiceReference1.blwwsSoap.CheckOutAsync(ConsoleApp4.ServiceReference1.CheckOutRequest request) { + return base.Channel.CheckOutAsync(request); + } + + public System.Threading.Tasks.Task CheckOutAsync(string key, string code, string roomNumber, System.DateTime checkOutDate, string errorMsg) { + ConsoleApp4.ServiceReference1.CheckOutRequest inValue = new ConsoleApp4.ServiceReference1.CheckOutRequest(); + inValue.Body = new ConsoleApp4.ServiceReference1.CheckOutRequestBody(); + inValue.Body.key = key; + inValue.Body.code = code; + inValue.Body.roomNumber = roomNumber; + inValue.Body.checkOutDate = checkOutDate; + inValue.Body.errorMsg = errorMsg; + return ((ConsoleApp4.ServiceReference1.blwwsSoap)(this)).CheckOutAsync(inValue); + } + + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + ConsoleApp4.ServiceReference1.RentRoomResponse ConsoleApp4.ServiceReference1.blwwsSoap.RentRoom(ConsoleApp4.ServiceReference1.RentRoomRequest request) { + return base.Channel.RentRoom(request); + } + + public bool RentRoom(string key, string code, string roomNumber, System.DateTime rentDate, ref string errorMsg) { + ConsoleApp4.ServiceReference1.RentRoomRequest inValue = new ConsoleApp4.ServiceReference1.RentRoomRequest(); + inValue.Body = new ConsoleApp4.ServiceReference1.RentRoomRequestBody(); + inValue.Body.key = key; + inValue.Body.code = code; + inValue.Body.roomNumber = roomNumber; + inValue.Body.rentDate = rentDate; + inValue.Body.errorMsg = errorMsg; + ConsoleApp4.ServiceReference1.RentRoomResponse retVal = ((ConsoleApp4.ServiceReference1.blwwsSoap)(this)).RentRoom(inValue); + errorMsg = retVal.Body.errorMsg; + return retVal.Body.RentRoomResult; + } + + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + System.Threading.Tasks.Task ConsoleApp4.ServiceReference1.blwwsSoap.RentRoomAsync(ConsoleApp4.ServiceReference1.RentRoomRequest request) { + return base.Channel.RentRoomAsync(request); + } + + public System.Threading.Tasks.Task RentRoomAsync(string key, string code, string roomNumber, System.DateTime rentDate, string errorMsg) { + ConsoleApp4.ServiceReference1.RentRoomRequest inValue = new ConsoleApp4.ServiceReference1.RentRoomRequest(); + inValue.Body = new ConsoleApp4.ServiceReference1.RentRoomRequestBody(); + inValue.Body.key = key; + inValue.Body.code = code; + inValue.Body.roomNumber = roomNumber; + inValue.Body.rentDate = rentDate; + inValue.Body.errorMsg = errorMsg; + return ((ConsoleApp4.ServiceReference1.blwwsSoap)(this)).RentRoomAsync(inValue); + } + } +} diff --git a/ConsoleApp4/Connected Services/ServiceReference1/Reference.svcmap b/ConsoleApp4/Connected Services/ServiceReference1/Reference.svcmap new file mode 100644 index 0000000..64f240f --- /dev/null +++ b/ConsoleApp4/Connected Services/ServiceReference1/Reference.svcmap @@ -0,0 +1,32 @@ + + + + false + true + true + + false + false + false + + + true + Auto + true + true + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ConsoleApp4/Connected Services/ServiceReference1/blwws.disco b/ConsoleApp4/Connected Services/ServiceReference1/blwws.disco new file mode 100644 index 0000000..6a9f572 --- /dev/null +++ b/ConsoleApp4/Connected Services/ServiceReference1/blwws.disco @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/ConsoleApp4/Connected Services/ServiceReference1/blwws.wsdl b/ConsoleApp4/Connected Services/ServiceReference1/blwws.wsdl new file mode 100644 index 0000000..266ff47 --- /dev/null +++ b/ConsoleApp4/Connected Services/ServiceReference1/blwws.wsdl @@ -0,0 +1,326 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 开房<br/>key:验证码(我方提供),code:编码(我方提供),roomNumber:房号,checkInDate:入住日期,xmlString:客人信息,errorMsg:返回错误信息,phoneNumber:手机号码(多个以英文逗号,隔开),idNumber:身份证号(多个以英文逗号,隔开):获取微信登录验证码 + + + + + 开房<br/>key:验证码(我方提供),code:编码(我方提供),roomNumber:房号,checkInDate:入住日期,xmlString:客人信息,errorMsg:返回错误信息,checkInID:返回入住记录ID,phoneNumber:手机号码(多个以英文逗号,隔开),idNumber:身份证号(多个以英文逗号,隔开):获取微信登录验证码 + + + + + 上传入住人信息<br/>key:验证码(我方提供),code:编码(我方提供),checkInID:入住记录ID,idType:证件类型(0身份证,1护照,2军官证,3其他),idCard:证件号码,name:姓名,sex:性别(0女,1男,2其他),birthday:出生日期(1999-01-01),photoUrl:图片路径(与photo二选一),photo:图片(二进制),errorMsg:错误信息 + + + + + 变更手机号<br/>key:验证码(我方提供),code:编码(我方提供),roomNumber:房号,errorMsg:错误信息,phoneNumber:手机号码(多个以英文逗号,隔开),idNumber:身份证号:获取验证码 + + + + + 退房<br/>key:验证码(我方提供),code:编码(我方提供),roomNumber:房号,checkOutDate:退房日期,errorMsg:错误信息 + + + + + 待租<br/>key:验证码(我方提供),code:编码(我方提供),roomNumber:房号,rentDate:变更待租日期,errorMsg:错误信息 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ConsoleApp4/Connected Services/ServiceReference1/configuration.svcinfo b/ConsoleApp4/Connected Services/ServiceReference1/configuration.svcinfo new file mode 100644 index 0000000..4d501ad --- /dev/null +++ b/ConsoleApp4/Connected Services/ServiceReference1/configuration.svcinfo @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/ConsoleApp4/Connected Services/ServiceReference1/configuration91.svcinfo b/ConsoleApp4/Connected Services/ServiceReference1/configuration91.svcinfo new file mode 100644 index 0000000..a46a28d --- /dev/null +++ b/ConsoleApp4/Connected Services/ServiceReference1/configuration91.svcinfo @@ -0,0 +1,201 @@ + + + + + + + blwwsSoap + + + + + + + + + + + + + + + + + + + + + StrongWildcard + + + + + + 65536 + + + + + + + + + System.ServiceModel.Configuration.XmlDictionaryReaderQuotasElement + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + System.Text.UTF8Encoding + + + Buffered + + + + + + Text + + + System.ServiceModel.Configuration.BasicHttpSecurityElement + + + None + + + System.ServiceModel.Configuration.HttpTransportSecurityElement + + + None + + + None + + + System.Security.Authentication.ExtendedProtection.Configuration.ExtendedProtectionPolicyElement + + + Never + + + TransportSelected + + + (集合) + + + + + + System.ServiceModel.Configuration.BasicHttpMessageSecurityElement + + + UserName + + + Default + + + + + + + + + http://localhost:22346/blwws.asmx + + + + + + basicHttpBinding + + + blwwsSoap + + + ServiceReference1.blwwsSoap + + + System.ServiceModel.Configuration.AddressHeaderCollectionElement + + + <Header /> + + + System.ServiceModel.Configuration.IdentityElement + + + System.ServiceModel.Configuration.UserPrincipalNameElement + + + + + + System.ServiceModel.Configuration.ServicePrincipalNameElement + + + + + + System.ServiceModel.Configuration.DnsElement + + + + + + System.ServiceModel.Configuration.RsaElement + + + + + + System.ServiceModel.Configuration.CertificateElement + + + + + + System.ServiceModel.Configuration.CertificateReferenceElement + + + My + + + LocalMachine + + + FindBySubjectDistinguishedName + + + + + + False + + + blwwsSoap + + + + + + + + + + + \ No newline at end of file diff --git a/ConsoleApp4/ConsoleApp4.csproj b/ConsoleApp4/ConsoleApp4.csproj new file mode 100644 index 0000000..74aa1f2 --- /dev/null +++ b/ConsoleApp4/ConsoleApp4.csproj @@ -0,0 +1,100 @@ + + + + + Debug + AnyCPU + {5E6081C2-BADB-43A4-8B26-0173EE89DFD6} + Exe + ConsoleApp4 + ConsoleApp4 + v4.8 + 512 + true + true + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + True + True + Reference.svcmap + + + + + + + + + Reference.svcmap + + + Reference.svcmap + + + Reference.svcmap + + + Reference.svcmap + + + Reference.svcmap + + + Reference.svcmap + + + + + + + + + + + + + + + + + + + + WCF Proxy Generator + Reference.cs + + + + \ No newline at end of file diff --git a/ConsoleApp4/Program.cs b/ConsoleApp4/Program.cs new file mode 100644 index 0000000..294ebcd --- /dev/null +++ b/ConsoleApp4/Program.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ConsoleApp4 +{ + internal class Program + { + static void Main(string[] args) + { + + ServiceReference1.blwwsSoapClient client = new ServiceReference1.blwwsSoapClient(); + var No = Encoding.UTF8.GetBytes(File.ReadAllText("11.txt")); + string str = ""; + var NNN = client.UploadPhoto( + "blw_ws@2015", + "2079", + 1368532, + 0, + "120224199110083813", + "唐德凯", + 1, + "1991-10-08", + photoUrl: "", + No, + ref str + ); + Console.WriteLine(NNN); + Console.WriteLine(str); + Console.ReadKey(); + } + } +} diff --git a/ConsoleApp4/Properties/AssemblyInfo.cs b/ConsoleApp4/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..02c0691 --- /dev/null +++ b/ConsoleApp4/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("ConsoleApp4")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("ConsoleApp4")] +[assembly: AssemblyCopyright("Copyright © 2025")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 会使此程序集中的类型 +//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("5e6081c2-badb-43a4-8b26-0173ee89dfd6")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/ConsoleApp5/App.config b/ConsoleApp5/App.config new file mode 100644 index 0000000..193aecc --- /dev/null +++ b/ConsoleApp5/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/ConsoleApp5/ConsoleApp5.csproj b/ConsoleApp5/ConsoleApp5.csproj new file mode 100644 index 0000000..20700f5 --- /dev/null +++ b/ConsoleApp5/ConsoleApp5.csproj @@ -0,0 +1,53 @@ + + + + + Debug + AnyCPU + {1D69AF3B-B959-4CBD-8726-CFF317E94D68} + Exe + ConsoleApp5 + ConsoleApp5 + v4.8 + 512 + true + true + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ConsoleApp5/Program.cs b/ConsoleApp5/Program.cs new file mode 100644 index 0000000..dc11f6c --- /dev/null +++ b/ConsoleApp5/Program.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ConsoleApp5 +{ + internal class Program + { + static void Main(string[] args) + { + Console.WriteLine("aaaaaaaaaaa"); + Console.ReadKey(); + } + } +} diff --git a/ConsoleApp5/Properties/AssemblyInfo.cs b/ConsoleApp5/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..1fa9e16 --- /dev/null +++ b/ConsoleApp5/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("ConsoleApp5")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("ConsoleApp5")] +[assembly: AssemblyCopyright("Copyright © 2025")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 会使此程序集中的类型 +//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("1d69af3b-b959-4cbd-8726-cff317e94d68")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/ConsoleApp6/App.config b/ConsoleApp6/App.config new file mode 100644 index 0000000..d95cf3d --- /dev/null +++ b/ConsoleApp6/App.config @@ -0,0 +1,23 @@ + + + + +
+ + + + + + + + + + + + + + http://pms.boonlive-rcu.com:89/blwws.asmx + + + + \ No newline at end of file diff --git a/ConsoleApp6/ConsoleApp6.csproj b/ConsoleApp6/ConsoleApp6.csproj new file mode 100644 index 0000000..2835cef --- /dev/null +++ b/ConsoleApp6/ConsoleApp6.csproj @@ -0,0 +1,98 @@ + + + + + Debug + AnyCPU + {02BC4AA5-6542-4CA8-B540-C435F15392AE} + Exe + ConsoleApp6 + ConsoleApp6 + v4.6.2 + 512 + true + true + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + + + True + True + Settings.settings + + + True + True + Reference.map + + + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + + MSDiscoCodeGenerator + Reference.cs + + + + + + + + + + + Dynamic + Web References\localhost\ + http://localhost:22346/blwws.asmx + + + + + Settings + ConsoleApp6_localhost_blwws + + + + + + + \ No newline at end of file diff --git a/ConsoleApp6/Program.cs b/ConsoleApp6/Program.cs new file mode 100644 index 0000000..77d28ff --- /dev/null +++ b/ConsoleApp6/Program.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.ServiceModel.Channels; +using System.Text; +using System.Threading.Tasks; + +namespace ConsoleApp6 +{ + internal class Program + { + static void Main(string[] args) + { + string bbb = ""; + + // 创建Cookie并添加到容器 + var cookie = new System.Net.Cookie("CookieName", "CookieValue", "/", "localhost"); + localhost.blwws blwws = new localhost.blwws(); + blwws.CookieContainer = new System.Net.CookieContainer(); + //blwws.CookieContainer.Add(cookie); + //blwws.UploadPhoto("aaccee^_^aaccee"); + string xmlstr = System.IO.File.ReadAllText("1.txt", Encoding.UTF8); + var Q= blwws.CheckIn("blw_ws@2015", "2006", "8201", DateTime.Now, xmlstr, ref bbb, "168616418194192160", "1"); + //blwws.UploadPhoto("blw_ws@2015", "1321", 0, 0, "01", "张露", 0, null, null, new byte[] { }, ref bbb); + //blwws.CheckIn("room", "oschina", "", DateTime.Now, "", ref bbb, "", ""); + Console.ReadKey(); + } + } +} diff --git a/ConsoleApp6/Properties/AssemblyInfo.cs b/ConsoleApp6/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..0b511f2 --- /dev/null +++ b/ConsoleApp6/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("ConsoleApp6")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("ConsoleApp6")] +[assembly: AssemblyCopyright("Copyright © 2025")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 会使此程序集中的类型 +//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("02bc4aa5-6542-4ca8-b540-c435f15392ae")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/ConsoleApp6/Properties/Settings.Designer.cs b/ConsoleApp6/Properties/Settings.Designer.cs new file mode 100644 index 0000000..44917c9 --- /dev/null +++ b/ConsoleApp6/Properties/Settings.Designer.cs @@ -0,0 +1,36 @@ +//------------------------------------------------------------------------------ +// +// 此代码由工具生成。 +// 运行时版本:4.0.30319.42000 +// +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 +// +//------------------------------------------------------------------------------ + +namespace ConsoleApp6.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.12.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + + [global::System.Configuration.ApplicationScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.SpecialSettingAttribute(global::System.Configuration.SpecialSetting.WebServiceUrl)] + [global::System.Configuration.DefaultSettingValueAttribute("http://localhost:6101/blwws.asmx")] + public string ConsoleApp6_localhost_blwws { + get { + return ((string)(this["ConsoleApp6_localhost_blwws"])); + } + } + } +} diff --git a/ConsoleApp6/Properties/Settings.settings b/ConsoleApp6/Properties/Settings.settings new file mode 100644 index 0000000..483bb45 --- /dev/null +++ b/ConsoleApp6/Properties/Settings.settings @@ -0,0 +1,9 @@ + + + + + + http://localhost:6101/blwws.asmx + + + \ No newline at end of file diff --git a/ConsoleApp6/Web References/localhost/Reference.cs b/ConsoleApp6/Web References/localhost/Reference.cs new file mode 100644 index 0000000..48e84dd --- /dev/null +++ b/ConsoleApp6/Web References/localhost/Reference.cs @@ -0,0 +1,758 @@ +//------------------------------------------------------------------------------ +// +// 此代码由工具生成。 +// 运行时版本:4.0.30319.42000 +// +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 +// +//------------------------------------------------------------------------------ + +// +// 此源代码是由 Microsoft.VSDesigner 4.0.30319.42000 版自动生成。 +// +#pragma warning disable 1591 + +namespace ConsoleApp6.localhost { + using System.Diagnostics; + using System; + using System.Xml.Serialization; + using System.ComponentModel; + using System.Web.Services.Protocols; + using System.Web.Services; + + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.8.9037.0")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Web.Services.WebServiceBindingAttribute(Name="blwwsSoap", Namespace="http://www.blw.com/")] + public partial class blwws : System.Web.Services.Protocols.SoapHttpClientProtocol { + + private System.Threading.SendOrPostCallback CheckInOperationCompleted; + + private System.Threading.SendOrPostCallback CheckIn2OperationCompleted; + + private System.Threading.SendOrPostCallback UploadPhotoOperationCompleted; + + private System.Threading.SendOrPostCallback ChangePhoneNumberOperationCompleted; + + private System.Threading.SendOrPostCallback CheckOutOperationCompleted; + + private System.Threading.SendOrPostCallback RentRoomOperationCompleted; + + private System.Threading.SendOrPostCallback PushBaoJing_IsEnableOperationCompleted; + + private System.Threading.SendOrPostCallback GetPushBaoJing_IsEnableOperationCompleted; + + private System.Threading.SendOrPostCallback AddHotelInfoOperationCompleted; + + private bool useDefaultCredentialsSetExplicitly; + + /// + public blwws() { + this.Url = global::ConsoleApp6.Properties.Settings.Default.ConsoleApp6_localhost_blwws; + if ((this.IsLocalFileSystemWebService(this.Url) == true)) { + this.UseDefaultCredentials = true; + this.useDefaultCredentialsSetExplicitly = false; + } + else { + this.useDefaultCredentialsSetExplicitly = true; + } + } + + public new string Url { + get { + return base.Url; + } + set { + if ((((this.IsLocalFileSystemWebService(base.Url) == true) + && (this.useDefaultCredentialsSetExplicitly == false)) + && (this.IsLocalFileSystemWebService(value) == false))) { + base.UseDefaultCredentials = false; + } + base.Url = value; + } + } + + public new bool UseDefaultCredentials { + get { + return base.UseDefaultCredentials; + } + set { + base.UseDefaultCredentials = value; + this.useDefaultCredentialsSetExplicitly = true; + } + } + + /// + public event CheckInCompletedEventHandler CheckInCompleted; + + /// + public event CheckIn2CompletedEventHandler CheckIn2Completed; + + /// + public event UploadPhotoCompletedEventHandler UploadPhotoCompleted; + + /// + public event ChangePhoneNumberCompletedEventHandler ChangePhoneNumberCompleted; + + /// + public event CheckOutCompletedEventHandler CheckOutCompleted; + + /// + public event RentRoomCompletedEventHandler RentRoomCompleted; + + /// + public event PushBaoJing_IsEnableCompletedEventHandler PushBaoJing_IsEnableCompleted; + + /// + public event GetPushBaoJing_IsEnableCompletedEventHandler GetPushBaoJing_IsEnableCompleted; + + /// + public event AddHotelInfoCompletedEventHandler AddHotelInfoCompleted; + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://www.blw.com/CheckIn", RequestNamespace="http://www.blw.com/", ResponseNamespace="http://www.blw.com/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public bool CheckIn(string key, string code, string roomNumber, System.DateTime checkInDate, string xmlString, ref string errorMsg, string phoneNumber, string idNumber) { + object[] results = this.Invoke("CheckIn", new object[] { + key, + code, + roomNumber, + checkInDate, + xmlString, + errorMsg, + phoneNumber, + idNumber}); + errorMsg = ((string)(results[1])); + return ((bool)(results[0])); + } + + /// + public void CheckInAsync(string key, string code, string roomNumber, System.DateTime checkInDate, string xmlString, string errorMsg, string phoneNumber, string idNumber) { + this.CheckInAsync(key, code, roomNumber, checkInDate, xmlString, errorMsg, phoneNumber, idNumber, null); + } + + /// + public void CheckInAsync(string key, string code, string roomNumber, System.DateTime checkInDate, string xmlString, string errorMsg, string phoneNumber, string idNumber, object userState) { + if ((this.CheckInOperationCompleted == null)) { + this.CheckInOperationCompleted = new System.Threading.SendOrPostCallback(this.OnCheckInOperationCompleted); + } + this.InvokeAsync("CheckIn", new object[] { + key, + code, + roomNumber, + checkInDate, + xmlString, + errorMsg, + phoneNumber, + idNumber}, this.CheckInOperationCompleted, userState); + } + + private void OnCheckInOperationCompleted(object arg) { + if ((this.CheckInCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.CheckInCompleted(this, new CheckInCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://www.blw.com/CheckIn2", RequestNamespace="http://www.blw.com/", ResponseNamespace="http://www.blw.com/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public bool CheckIn2(string key, string code, string roomNumber, System.DateTime checkInDate, string xmlString, ref string errorMsg, ref long checkInID, string phoneNumber, string idNumber) { + object[] results = this.Invoke("CheckIn2", new object[] { + key, + code, + roomNumber, + checkInDate, + xmlString, + errorMsg, + checkInID, + phoneNumber, + idNumber}); + errorMsg = ((string)(results[1])); + checkInID = ((long)(results[2])); + return ((bool)(results[0])); + } + + /// + public void CheckIn2Async(string key, string code, string roomNumber, System.DateTime checkInDate, string xmlString, string errorMsg, long checkInID, string phoneNumber, string idNumber) { + this.CheckIn2Async(key, code, roomNumber, checkInDate, xmlString, errorMsg, checkInID, phoneNumber, idNumber, null); + } + + /// + public void CheckIn2Async(string key, string code, string roomNumber, System.DateTime checkInDate, string xmlString, string errorMsg, long checkInID, string phoneNumber, string idNumber, object userState) { + if ((this.CheckIn2OperationCompleted == null)) { + this.CheckIn2OperationCompleted = new System.Threading.SendOrPostCallback(this.OnCheckIn2OperationCompleted); + } + this.InvokeAsync("CheckIn2", new object[] { + key, + code, + roomNumber, + checkInDate, + xmlString, + errorMsg, + checkInID, + phoneNumber, + idNumber}, this.CheckIn2OperationCompleted, userState); + } + + private void OnCheckIn2OperationCompleted(object arg) { + if ((this.CheckIn2Completed != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.CheckIn2Completed(this, new CheckIn2CompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://www.blw.com/UploadPhoto", RequestNamespace="http://www.blw.com/", ResponseNamespace="http://www.blw.com/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public bool UploadPhoto(string key, string code, long checkInID, int idType, string idCard, string name, int sex, string birthday, string photoUrl, [System.Xml.Serialization.XmlElementAttribute(DataType="base64Binary")] byte[] photo, ref string errorMsg) { + object[] results = this.Invoke("UploadPhoto", new object[] { + key, + code, + checkInID, + idType, + idCard, + name, + sex, + birthday, + photoUrl, + photo, + errorMsg}); + errorMsg = ((string)(results[1])); + return ((bool)(results[0])); + } + + /// + public void UploadPhotoAsync(string key, string code, long checkInID, int idType, string idCard, string name, int sex, string birthday, string photoUrl, byte[] photo, string errorMsg) { + this.UploadPhotoAsync(key, code, checkInID, idType, idCard, name, sex, birthday, photoUrl, photo, errorMsg, null); + } + + /// + public void UploadPhotoAsync(string key, string code, long checkInID, int idType, string idCard, string name, int sex, string birthday, string photoUrl, byte[] photo, string errorMsg, object userState) { + if ((this.UploadPhotoOperationCompleted == null)) { + this.UploadPhotoOperationCompleted = new System.Threading.SendOrPostCallback(this.OnUploadPhotoOperationCompleted); + } + this.InvokeAsync("UploadPhoto", new object[] { + key, + code, + checkInID, + idType, + idCard, + name, + sex, + birthday, + photoUrl, + photo, + errorMsg}, this.UploadPhotoOperationCompleted, userState); + } + + private void OnUploadPhotoOperationCompleted(object arg) { + if ((this.UploadPhotoCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.UploadPhotoCompleted(this, new UploadPhotoCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://www.blw.com/ChangePhoneNumber", RequestNamespace="http://www.blw.com/", ResponseNamespace="http://www.blw.com/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public bool ChangePhoneNumber(string key, string code, string roomNumber, string phoneNumber, string idNumber, ref string errorMsg) { + object[] results = this.Invoke("ChangePhoneNumber", new object[] { + key, + code, + roomNumber, + phoneNumber, + idNumber, + errorMsg}); + errorMsg = ((string)(results[1])); + return ((bool)(results[0])); + } + + /// + public void ChangePhoneNumberAsync(string key, string code, string roomNumber, string phoneNumber, string idNumber, string errorMsg) { + this.ChangePhoneNumberAsync(key, code, roomNumber, phoneNumber, idNumber, errorMsg, null); + } + + /// + public void ChangePhoneNumberAsync(string key, string code, string roomNumber, string phoneNumber, string idNumber, string errorMsg, object userState) { + if ((this.ChangePhoneNumberOperationCompleted == null)) { + this.ChangePhoneNumberOperationCompleted = new System.Threading.SendOrPostCallback(this.OnChangePhoneNumberOperationCompleted); + } + this.InvokeAsync("ChangePhoneNumber", new object[] { + key, + code, + roomNumber, + phoneNumber, + idNumber, + errorMsg}, this.ChangePhoneNumberOperationCompleted, userState); + } + + private void OnChangePhoneNumberOperationCompleted(object arg) { + if ((this.ChangePhoneNumberCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.ChangePhoneNumberCompleted(this, new ChangePhoneNumberCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://www.blw.com/CheckOut", RequestNamespace="http://www.blw.com/", ResponseNamespace="http://www.blw.com/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public bool CheckOut(string key, string code, string roomNumber, System.DateTime checkOutDate, ref string errorMsg) { + object[] results = this.Invoke("CheckOut", new object[] { + key, + code, + roomNumber, + checkOutDate, + errorMsg}); + errorMsg = ((string)(results[1])); + return ((bool)(results[0])); + } + + /// + public void CheckOutAsync(string key, string code, string roomNumber, System.DateTime checkOutDate, string errorMsg) { + this.CheckOutAsync(key, code, roomNumber, checkOutDate, errorMsg, null); + } + + /// + public void CheckOutAsync(string key, string code, string roomNumber, System.DateTime checkOutDate, string errorMsg, object userState) { + if ((this.CheckOutOperationCompleted == null)) { + this.CheckOutOperationCompleted = new System.Threading.SendOrPostCallback(this.OnCheckOutOperationCompleted); + } + this.InvokeAsync("CheckOut", new object[] { + key, + code, + roomNumber, + checkOutDate, + errorMsg}, this.CheckOutOperationCompleted, userState); + } + + private void OnCheckOutOperationCompleted(object arg) { + if ((this.CheckOutCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.CheckOutCompleted(this, new CheckOutCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://www.blw.com/RentRoom", RequestNamespace="http://www.blw.com/", ResponseNamespace="http://www.blw.com/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public bool RentRoom(string key, string code, string roomNumber, System.DateTime rentDate, ref string errorMsg) { + object[] results = this.Invoke("RentRoom", new object[] { + key, + code, + roomNumber, + rentDate, + errorMsg}); + errorMsg = ((string)(results[1])); + return ((bool)(results[0])); + } + + /// + public void RentRoomAsync(string key, string code, string roomNumber, System.DateTime rentDate, string errorMsg) { + this.RentRoomAsync(key, code, roomNumber, rentDate, errorMsg, null); + } + + /// + public void RentRoomAsync(string key, string code, string roomNumber, System.DateTime rentDate, string errorMsg, object userState) { + if ((this.RentRoomOperationCompleted == null)) { + this.RentRoomOperationCompleted = new System.Threading.SendOrPostCallback(this.OnRentRoomOperationCompleted); + } + this.InvokeAsync("RentRoom", new object[] { + key, + code, + roomNumber, + rentDate, + errorMsg}, this.RentRoomOperationCompleted, userState); + } + + private void OnRentRoomOperationCompleted(object arg) { + if ((this.RentRoomCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.RentRoomCompleted(this, new RentRoomCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://www.blw.com/PushBaoJing_IsEnable", RequestNamespace="http://www.blw.com/", ResponseNamespace="http://www.blw.com/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public void PushBaoJing_IsEnable(string key, string code, bool isable) { + this.Invoke("PushBaoJing_IsEnable", new object[] { + key, + code, + isable}); + } + + /// + public void PushBaoJing_IsEnableAsync(string key, string code, bool isable) { + this.PushBaoJing_IsEnableAsync(key, code, isable, null); + } + + /// + public void PushBaoJing_IsEnableAsync(string key, string code, bool isable, object userState) { + if ((this.PushBaoJing_IsEnableOperationCompleted == null)) { + this.PushBaoJing_IsEnableOperationCompleted = new System.Threading.SendOrPostCallback(this.OnPushBaoJing_IsEnableOperationCompleted); + } + this.InvokeAsync("PushBaoJing_IsEnable", new object[] { + key, + code, + isable}, this.PushBaoJing_IsEnableOperationCompleted, userState); + } + + private void OnPushBaoJing_IsEnableOperationCompleted(object arg) { + if ((this.PushBaoJing_IsEnableCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.PushBaoJing_IsEnableCompleted(this, new System.ComponentModel.AsyncCompletedEventArgs(invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://www.blw.com/GetPushBaoJing_IsEnable", RequestNamespace="http://www.blw.com/", ResponseNamespace="http://www.blw.com/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public int GetPushBaoJing_IsEnable(string key, string code) { + object[] results = this.Invoke("GetPushBaoJing_IsEnable", new object[] { + key, + code}); + return ((int)(results[0])); + } + + /// + public void GetPushBaoJing_IsEnableAsync(string key, string code) { + this.GetPushBaoJing_IsEnableAsync(key, code, null); + } + + /// + public void GetPushBaoJing_IsEnableAsync(string key, string code, object userState) { + if ((this.GetPushBaoJing_IsEnableOperationCompleted == null)) { + this.GetPushBaoJing_IsEnableOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetPushBaoJing_IsEnableOperationCompleted); + } + this.InvokeAsync("GetPushBaoJing_IsEnable", new object[] { + key, + code}, this.GetPushBaoJing_IsEnableOperationCompleted, userState); + } + + private void OnGetPushBaoJing_IsEnableOperationCompleted(object arg) { + if ((this.GetPushBaoJing_IsEnableCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.GetPushBaoJing_IsEnableCompleted(this, new GetPushBaoJing_IsEnableCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://www.blw.com/AddHotelInfo", RequestNamespace="http://www.blw.com/", ResponseNamespace="http://www.blw.com/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public int AddHotelInfo(string key, string Code, string HotelName, int HotelId) { + object[] results = this.Invoke("AddHotelInfo", new object[] { + key, + Code, + HotelName, + HotelId}); + return ((int)(results[0])); + } + + /// + public void AddHotelInfoAsync(string key, string Code, string HotelName, int HotelId) { + this.AddHotelInfoAsync(key, Code, HotelName, HotelId, null); + } + + /// + public void AddHotelInfoAsync(string key, string Code, string HotelName, int HotelId, object userState) { + if ((this.AddHotelInfoOperationCompleted == null)) { + this.AddHotelInfoOperationCompleted = new System.Threading.SendOrPostCallback(this.OnAddHotelInfoOperationCompleted); + } + this.InvokeAsync("AddHotelInfo", new object[] { + key, + Code, + HotelName, + HotelId}, this.AddHotelInfoOperationCompleted, userState); + } + + private void OnAddHotelInfoOperationCompleted(object arg) { + if ((this.AddHotelInfoCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.AddHotelInfoCompleted(this, new AddHotelInfoCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + public new void CancelAsync(object userState) { + base.CancelAsync(userState); + } + + private bool IsLocalFileSystemWebService(string url) { + if (((url == null) + || (url == string.Empty))) { + return false; + } + System.Uri wsUri = new System.Uri(url); + if (((wsUri.Port >= 1024) + && (string.Compare(wsUri.Host, "localHost", System.StringComparison.OrdinalIgnoreCase) == 0))) { + return true; + } + return false; + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.8.9037.0")] + public delegate void CheckInCompletedEventHandler(object sender, CheckInCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.8.9037.0")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class CheckInCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal CheckInCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public bool Result { + get { + this.RaiseExceptionIfNecessary(); + return ((bool)(this.results[0])); + } + } + + /// + public string errorMsg { + get { + this.RaiseExceptionIfNecessary(); + return ((string)(this.results[1])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.8.9037.0")] + public delegate void CheckIn2CompletedEventHandler(object sender, CheckIn2CompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.8.9037.0")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class CheckIn2CompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal CheckIn2CompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public bool Result { + get { + this.RaiseExceptionIfNecessary(); + return ((bool)(this.results[0])); + } + } + + /// + public string errorMsg { + get { + this.RaiseExceptionIfNecessary(); + return ((string)(this.results[1])); + } + } + + /// + public long checkInID { + get { + this.RaiseExceptionIfNecessary(); + return ((long)(this.results[2])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.8.9037.0")] + public delegate void UploadPhotoCompletedEventHandler(object sender, UploadPhotoCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.8.9037.0")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class UploadPhotoCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal UploadPhotoCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public bool Result { + get { + this.RaiseExceptionIfNecessary(); + return ((bool)(this.results[0])); + } + } + + /// + public string errorMsg { + get { + this.RaiseExceptionIfNecessary(); + return ((string)(this.results[1])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.8.9037.0")] + public delegate void ChangePhoneNumberCompletedEventHandler(object sender, ChangePhoneNumberCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.8.9037.0")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class ChangePhoneNumberCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal ChangePhoneNumberCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public bool Result { + get { + this.RaiseExceptionIfNecessary(); + return ((bool)(this.results[0])); + } + } + + /// + public string errorMsg { + get { + this.RaiseExceptionIfNecessary(); + return ((string)(this.results[1])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.8.9037.0")] + public delegate void CheckOutCompletedEventHandler(object sender, CheckOutCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.8.9037.0")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class CheckOutCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal CheckOutCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public bool Result { + get { + this.RaiseExceptionIfNecessary(); + return ((bool)(this.results[0])); + } + } + + /// + public string errorMsg { + get { + this.RaiseExceptionIfNecessary(); + return ((string)(this.results[1])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.8.9037.0")] + public delegate void RentRoomCompletedEventHandler(object sender, RentRoomCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.8.9037.0")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class RentRoomCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal RentRoomCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public bool Result { + get { + this.RaiseExceptionIfNecessary(); + return ((bool)(this.results[0])); + } + } + + /// + public string errorMsg { + get { + this.RaiseExceptionIfNecessary(); + return ((string)(this.results[1])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.8.9037.0")] + public delegate void PushBaoJing_IsEnableCompletedEventHandler(object sender, System.ComponentModel.AsyncCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.8.9037.0")] + public delegate void GetPushBaoJing_IsEnableCompletedEventHandler(object sender, GetPushBaoJing_IsEnableCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.8.9037.0")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class GetPushBaoJing_IsEnableCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal GetPushBaoJing_IsEnableCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public int Result { + get { + this.RaiseExceptionIfNecessary(); + return ((int)(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.8.9037.0")] + public delegate void AddHotelInfoCompletedEventHandler(object sender, AddHotelInfoCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "4.8.9037.0")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class AddHotelInfoCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal AddHotelInfoCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public int Result { + get { + this.RaiseExceptionIfNecessary(); + return ((int)(this.results[0])); + } + } + } +} + +#pragma warning restore 1591 \ No newline at end of file diff --git a/ConsoleApp6/Web References/localhost/Reference.map b/ConsoleApp6/Web References/localhost/Reference.map new file mode 100644 index 0000000..a961042 --- /dev/null +++ b/ConsoleApp6/Web References/localhost/Reference.map @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/ConsoleApp6/Web References/localhost/blwws.disco b/ConsoleApp6/Web References/localhost/blwws.disco new file mode 100644 index 0000000..f1ba21d --- /dev/null +++ b/ConsoleApp6/Web References/localhost/blwws.disco @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/ConsoleApp6/Web References/localhost/blwws.wsdl b/ConsoleApp6/Web References/localhost/blwws.wsdl new file mode 100644 index 0000000..c58990b --- /dev/null +++ b/ConsoleApp6/Web References/localhost/blwws.wsdl @@ -0,0 +1,456 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 开房<br/>key:验证码(我方提供),code:编码(我方提供),roomNumber:房号,checkInDate:入住日期,xmlString:客人信息,errorMsg:返回错误信息,phoneNumber:手机号码(多个以英文逗号,隔开),idNumber:身份证号(多个以英文逗号,隔开):获取微信登录验证码 + + + + + 开房<br/>key:验证码(我方提供),code:编码(我方提供),roomNumber:房号,checkInDate:入住日期,xmlString:客人信息,errorMsg:返回错误信息,checkInID:返回入住记录ID,phoneNumber:手机号码(多个以英文逗号,隔开),idNumber:身份证号(多个以英文逗号,隔开):获取微信登录验证码 + + + + + 上传入住人信息<br/>key:验证码(我方提供),code:编码(我方提供),checkInID:入住记录ID,idType:证件类型(0身份证,1护照,2军官证,3其他),idCard:证件号码,name:姓名,sex:性别(0女,1男,2其他),birthday:出生日期(1999-01-01),photoUrl:图片路径(与photo二选一),photo:图片(二进制),errorMsg:错误信息 + + + + + 变更手机号<br/>key:验证码(我方提供),code:编码(我方提供),roomNumber:房号,errorMsg:错误信息,phoneNumber:手机号码(多个以英文逗号,隔开),idNumber:身份证号:获取验证码 + + + + + 退房<br/>key:验证码(我方提供),code:编码(我方提供),roomNumber:房号,checkOutDate:退房日期,errorMsg:错误信息 + + + + + 待租<br/>key:验证码(我方提供),code:编码(我方提供),roomNumber:房号,rentDate:变更待租日期,errorMsg:错误信息 + + + + + 推送数据到宝镜 + + + + + 获取是否推送PMS数据到宝镜 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ConsoleApp7/ConsoleApp7.csproj b/ConsoleApp7/ConsoleApp7.csproj new file mode 100644 index 0000000..72e5ab4 --- /dev/null +++ b/ConsoleApp7/ConsoleApp7.csproj @@ -0,0 +1,51 @@ + + + + + Debug + AnyCPU + {8F89AC96-6F8F-46A0-A443-352B295A5EA0} + Exe + ConsoleApp7 + ConsoleApp7 + v4.0 + 512 + true + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\BLWWS\RestSharp\RestSharp.dll + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ConsoleApp7/Program.cs b/ConsoleApp7/Program.cs new file mode 100644 index 0000000..4ea41f6 --- /dev/null +++ b/ConsoleApp7/Program.cs @@ -0,0 +1,51 @@ +using System; +using System.Net; +using RestSharp; + +namespace ConsoleApp7 +{ + public class PMSDataBase + { + public string hotel_code { get; set; } = ""; + public string time { get; set; } = ""; + public string sign { get; set; } = ""; + public string hotel_id { get; set; } = ""; + public string order_no { get; set; } = ""; + public string room_no { get; set; } = ""; + public string check_out_original { get; set; } + } + internal class Program + { + static void Main(string[] args) + { + //ssl 协议不兼容 + var A = (SecurityProtocolType)48; + var B = (SecurityProtocolType)192; + var C = (SecurityProtocolType)768; + var D = (SecurityProtocolType)3072; + var E = (SecurityProtocolType)12288; + ServicePointManager.SecurityProtocol = A | B | C | D | E; + PMSDataBase data = new PMSDataBase() + { + hotel_code = "2079", + time = "1751426235", + sign = "a68b2596ce7c1ca970e82a00626c16e3", + hotel_id = "1101", + order_no = "", + room_no = "1102", + check_out_original = "" + }; + + //string BaseURL = "https://f.blv-oa.com:8099/rcu_pms_api/v1"; + string BaseURL = "http://localhost:5027"; + var client123 = new RestClient(BaseURL); + var request123 = new RestRequest("/api/values/hello", Method.POST); + //request123.AddHeader("Content-Type", "application/json"); + request123.AddJsonBody(data); + var Response = client123.Execute(request123).Content; + string content12345 = Response; + Console.WriteLine(content12345); + Console.ReadKey(); + } + } +} diff --git a/ConsoleApp7/Properties/AssemblyInfo.cs b/ConsoleApp7/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..8ecb30c --- /dev/null +++ b/ConsoleApp7/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("ConsoleApp7")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("ConsoleApp7")] +[assembly: AssemblyCopyright("Copyright © 2025")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 会使此程序集中的类型 +//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("8f89ac96-6f8f-46a0-a443-352b295a5ea0")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/HttpsTran/1.txt b/HttpsTran/1.txt new file mode 100644 index 0000000..6d539e5 --- /dev/null +++ b/HttpsTran/1.txt @@ -0,0 +1,26 @@ +{ + "checkIn": "2025-07-08 15:17:54", + "checkOut": "2025-07-09 15:17:54", + "is_breakfast": 1, + "breakfast": 1, + "rateCode": "", + "amount": "10", + "order_original": "", + "infos": [ + { + "name": "张三", + "mobile": "15515750973", + "type": 0, + "idcard": "41088119324234234234", + "sex": 1, + "address": "" + } + ], + "hotel_code": "1085", + "time": "1751959077", + "sign": "be647b58c466991ab5946998ef87bbc5", + "hotel_id": "98", + "order_no": "111", + "room_no": "二楼H区", + "check_out_original": null +} \ No newline at end of file diff --git a/HttpsTran/HttpsTran.csproj b/HttpsTran/HttpsTran.csproj new file mode 100644 index 0000000..fbfa76f --- /dev/null +++ b/HttpsTran/HttpsTran.csproj @@ -0,0 +1,168 @@ + + + + + Debug + AnyCPU + + + 2.0 + {BB1F703D-36E6-4C5B-9BCF-D7A6FB97C113} + {349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc} + Library + Properties + HttpsTran + HttpsTran + v4.7.2 + true + + + + + + + + + + + true + full + false + bin\ + DEBUG;TRACE + prompt + 4 + + + true + pdbonly + true + bin\ + TRACE + prompt + 4 + + + + ..\packages\Microsoft.Bcl.AsyncInterfaces.8.0.0\lib\net462\Microsoft.Bcl.AsyncInterfaces.dll + + + + ..\packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll + + + ..\packages\NLog.6.0.1\lib\net46\NLog.dll + + + ..\packages\RestSharp.112.1.0\lib\net471\RestSharp.dll + + + ..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll + + + ..\packages\System.Memory.4.5.5\lib\net461\System.Memory.dll + + + + + ..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll + + + ..\packages\System.Runtime.CompilerServices.Unsafe.6.0.0\lib\net461\System.Runtime.CompilerServices.Unsafe.dll + + + ..\packages\System.Text.Encodings.Web.8.0.0\lib\net462\System.Text.Encodings.Web.dll + + + ..\packages\System.Text.Json.8.0.4\lib\net462\System.Text.Json.dll + + + ..\packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll + + + ..\packages\System.ValueTuple.4.5.0\lib\net47\System.ValueTuple.dll + + + + + + + + + + + + + + + + + + + + + ..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.2.0.1\lib\net45\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.dll + + + + + + + + + + WebService1.asmx + Component + + + + + PreserveNewest + + + + Web.config + + + Web.config + + + + 10.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + + + + + + True + True + 64121 + / + http://localhost:64121/ + False + False + + + False + + + + + + + 这台计算机上缺少此项目引用的 NuGet 程序包。使用“NuGet 程序包还原”可下载这些程序包。有关更多信息,请参见 http://go.microsoft.com/fwlink/?LinkID=322105。缺少的文件是 {0}。 + + + + + \ No newline at end of file diff --git a/HttpsTran/Properties/AssemblyInfo.cs b/HttpsTran/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..9e67b4a --- /dev/null +++ b/HttpsTran/Properties/AssemblyInfo.cs @@ -0,0 +1,35 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的常规信息通过下列特性集 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("HttpsTran")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("HttpsTran")] +[assembly: AssemblyCopyright("Copyright © 2025")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 会使此程序集中的类型 +// 对 COM 组件不可见。如果需要 +// 从 COM 访问此程序集中的某个类型,请针对该类型将 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于 typelib 的 ID +[assembly: Guid("bb1f703d-36e6-4c5b-9bcf-d7a6fb97c113")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 内部版本号 +// 修订版本 +// +// 可以指定所有值,也可以使用“修订号”和“内部版本号”的默认值, +// 方法是按如下所示使用 "*": +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/HttpsTran/Web.Debug.config b/HttpsTran/Web.Debug.config new file mode 100644 index 0000000..b9a9fde --- /dev/null +++ b/HttpsTran/Web.Debug.config @@ -0,0 +1,31 @@ + + + + + + + + + + \ No newline at end of file diff --git a/HttpsTran/Web.Release.config b/HttpsTran/Web.Release.config new file mode 100644 index 0000000..755e745 --- /dev/null +++ b/HttpsTran/Web.Release.config @@ -0,0 +1,32 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/HttpsTran/Web.config b/HttpsTran/Web.config new file mode 100644 index 0000000..3ed1cbe --- /dev/null +++ b/HttpsTran/Web.config @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/HttpsTran/WebService1.asmx b/HttpsTran/WebService1.asmx new file mode 100644 index 0000000..1586822 --- /dev/null +++ b/HttpsTran/WebService1.asmx @@ -0,0 +1 @@ +<%@ WebService Language="C#" CodeBehind="WebService1.asmx.cs" Class="HttpsTran.WebService1" %> diff --git a/HttpsTran/WebService1.asmx.cs b/HttpsTran/WebService1.asmx.cs new file mode 100644 index 0000000..5366184 --- /dev/null +++ b/HttpsTran/WebService1.asmx.cs @@ -0,0 +1,84 @@ +using System; +using System.Collections.Generic; +using System.Configuration; +using System.IO; +using System.Linq; +using System.Net; +using System.Text; +using System.Web; +using System.Web.Services; +using Newtonsoft.Json; +using NLog; +using RestSharp; + +namespace HttpsTran +{ + /// + /// WebService1 的摘要说明 + /// + [WebService(Namespace = "http://tempuri.org/")] + [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] + [System.ComponentModel.ToolboxItem(false)] + // 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消注释以下行。 + // [System.Web.Script.Services.ScriptService] + public class WebService1 : System.Web.Services.WebService + { + + private readonly Logger _logger = LogManager.GetCurrentClassLogger(); + public static string BaseURL = ConfigurationManager.AppSettings["BaoJing_BaseUrl"]; + [WebMethod] + public string HelloWorld(string key, string data, string url) + { + try + { + if (key.Equals("C24cAfK")) + { + //ssl 协议不兼容 + var A = (SecurityProtocolType)48; + var B = (SecurityProtocolType)192; + var C = (SecurityProtocolType)768; + var D = (SecurityProtocolType)3072; + var E = (SecurityProtocolType)12288; + ServicePointManager.SecurityProtocol = A | B | C | D | E; + BaseURL = "https://localhost:7009/"; + var client123 = new RestClient(BaseURL); + //var request123 = new RestRequest("/order/checkOut", Method.POST); + var request123 = new RestRequest(url, Method.Post); + request123.AddHeader("Content-Type", "application/json"); + //var N = Newtonsoft.Json.JsonConvert.DeserializeObject(data); + //var UUU = JsonConvert.SerializeObject(N); + _logger.Error("发送的数据为:"+data); + //request123.AddJsonBody(data); + request123.AddStringBody(data,DataFormat.Json); + var Response = client123.Execute(request123).Content; + string content12345 = Response; + return content12345; + } + } + catch (Exception ex) + { + _logger.Error(ex.Message); + } + return "error"; + } + [WebMethod()] + public string HHH() + { + var Q = File.ReadAllText(Server.MapPath("1.txt"), Encoding.UTF8); + var N = Newtonsoft.Json.JsonConvert.DeserializeObject(Q); + var UUU = JsonConvert.SerializeObject(N); + return "aaaaaaa"; + + } + } + public class PMSDataBase + { + public string hotel_code { get; set; } = ""; + public string time { get; set; } = ""; + public string sign { get; set; } = ""; + public string hotel_id { get; set; } = ""; + public string order_no { get; set; } = ""; + public string room_no { get; set; } = ""; + public string check_out_original { get; set; } + } +} diff --git a/HttpsTran/nlog.config b/HttpsTran/nlog.config new file mode 100644 index 0000000..3a1832e --- /dev/null +++ b/HttpsTran/nlog.config @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/HttpsTran/packages.config b/HttpsTran/packages.config new file mode 100644 index 0000000..f28727e --- /dev/null +++ b/HttpsTran/packages.config @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/MyQianLiMa/App_Start/WebApiConfig.cs b/MyQianLiMa/App_Start/WebApiConfig.cs new file mode 100644 index 0000000..f641eca --- /dev/null +++ b/MyQianLiMa/App_Start/WebApiConfig.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web.Http; + +namespace MyQianLiMa +{ + public static class WebApiConfig + { + public static void Register(HttpConfiguration config) + { + // Web API 配置和服务 + + // Web API 路由 + config.MapHttpAttributeRoutes(); + + config.Routes.MapHttpRoute( + name: "DefaultApi", + routeTemplate: "api/{controller}/{id}", + defaults: new { id = RouteParameter.Optional } + ); + } + } +} diff --git a/MyQianLiMa/Common/CSRedisCacheHelper.cs b/MyQianLiMa/Common/CSRedisCacheHelper.cs new file mode 100644 index 0000000..2d3dd45 --- /dev/null +++ b/MyQianLiMa/Common/CSRedisCacheHelper.cs @@ -0,0 +1,107 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Configuration; +using CSRedis; + +namespace BLWWS.PMS.Common +{ + /// + /// Redis缓存辅助类 + /// + public class CSRedisCacheHelper + { + public static CSRedisClient redis; + private static int SessionExpireMinutes = 60 * 24 * 60; + + public static string pwd = ConfigurationManager.AppSettings["redis_pwd"]; + static CSRedisCacheHelper() + { + //var redisHostStr = "127.0.0.1:7555,poolsize=20"; + var redisHostStr = "127.0.0.1:6379,poolsize=20"; + if (!string.IsNullOrEmpty(redisHostStr)) + { + //redis = new CSRedisClient(redisHostStr + ",password=cw_oy_lsh,defaultDatabase=1"); + string str = string.Format(",password={0},defaultDatabase=1", pwd); + redis = new CSRedisClient(redisHostStr + str); + } + } + /// + /// 添加缓存 + /// + /// + /// + /// + public static void Set(string key, T value) + { + redis.Set(key, value, SessionExpireMinutes * 60); + } + + public static T Get(string key) + { + return redis.Get(key); + } + + public static void Forever(string key, T value) + { + redis.Set(key, value, -1); + } + public static void Del(string key) + { + redis.Del(key); + } + + /// + /// 判断是否存在 + /// + /// + /// + /// + public static bool Contains(string key, string mac) + { + bool result = redis.Exists(mac); + if (!result) + { + result = redis.Exists(key); + } + return result; + } + + public static bool Contains(string key) + { + bool result = redis.Exists(key); + return result; + } + /// + /// 添加Hash缓存 + /// + /// + /// + /// + public static void HMSet(string key, T value) + { + redis.HMSet(key, value); + } + /// + /// 获取Hash缓存 + /// + /// + /// + /// + public static T[] HMGet(string key) + { + return redis.HMGet(key); + } + /// + /// 删除Hash缓存 + /// + /// + /// + /// + public static long HDel(string key) + { + return redis.HDel(key); + } + } +} diff --git a/MyQianLiMa/Connected Services/ServiceReference1/MyQianLiMa.ServiceReference1.AddHotelInfoResponse.datasource b/MyQianLiMa/Connected Services/ServiceReference1/MyQianLiMa.ServiceReference1.AddHotelInfoResponse.datasource new file mode 100644 index 0000000..c0be2fd --- /dev/null +++ b/MyQianLiMa/Connected Services/ServiceReference1/MyQianLiMa.ServiceReference1.AddHotelInfoResponse.datasource @@ -0,0 +1,10 @@ + + + + MyQianLiMa.ServiceReference1.AddHotelInfoResponse, Connected Services.ServiceReference1.Reference.cs.dll, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + \ No newline at end of file diff --git a/MyQianLiMa/Connected Services/ServiceReference1/MyQianLiMa.ServiceReference1.ChangePhoneNumberResponse.datasource b/MyQianLiMa/Connected Services/ServiceReference1/MyQianLiMa.ServiceReference1.ChangePhoneNumberResponse.datasource new file mode 100644 index 0000000..493ad4e --- /dev/null +++ b/MyQianLiMa/Connected Services/ServiceReference1/MyQianLiMa.ServiceReference1.ChangePhoneNumberResponse.datasource @@ -0,0 +1,10 @@ + + + + MyQianLiMa.ServiceReference1.ChangePhoneNumberResponse, Connected Services.ServiceReference1.Reference.cs.dll, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + \ No newline at end of file diff --git a/MyQianLiMa/Connected Services/ServiceReference1/MyQianLiMa.ServiceReference1.CheckIn2Response.datasource b/MyQianLiMa/Connected Services/ServiceReference1/MyQianLiMa.ServiceReference1.CheckIn2Response.datasource new file mode 100644 index 0000000..d87394c --- /dev/null +++ b/MyQianLiMa/Connected Services/ServiceReference1/MyQianLiMa.ServiceReference1.CheckIn2Response.datasource @@ -0,0 +1,10 @@ + + + + MyQianLiMa.ServiceReference1.CheckIn2Response, Connected Services.ServiceReference1.Reference.cs.dll, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + \ No newline at end of file diff --git a/MyQianLiMa/Connected Services/ServiceReference1/MyQianLiMa.ServiceReference1.CheckInResponse.datasource b/MyQianLiMa/Connected Services/ServiceReference1/MyQianLiMa.ServiceReference1.CheckInResponse.datasource new file mode 100644 index 0000000..fb547c6 --- /dev/null +++ b/MyQianLiMa/Connected Services/ServiceReference1/MyQianLiMa.ServiceReference1.CheckInResponse.datasource @@ -0,0 +1,10 @@ + + + + MyQianLiMa.ServiceReference1.CheckInResponse, Connected Services.ServiceReference1.Reference.cs.dll, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + \ No newline at end of file diff --git a/MyQianLiMa/Connected Services/ServiceReference1/MyQianLiMa.ServiceReference1.CheckOutResponse.datasource b/MyQianLiMa/Connected Services/ServiceReference1/MyQianLiMa.ServiceReference1.CheckOutResponse.datasource new file mode 100644 index 0000000..31dbfb1 --- /dev/null +++ b/MyQianLiMa/Connected Services/ServiceReference1/MyQianLiMa.ServiceReference1.CheckOutResponse.datasource @@ -0,0 +1,10 @@ + + + + MyQianLiMa.ServiceReference1.CheckOutResponse, Connected Services.ServiceReference1.Reference.cs.dll, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + \ No newline at end of file diff --git a/MyQianLiMa/Connected Services/ServiceReference1/MyQianLiMa.ServiceReference1.GetPushBaoJing_IsEnableResponse.datasource b/MyQianLiMa/Connected Services/ServiceReference1/MyQianLiMa.ServiceReference1.GetPushBaoJing_IsEnableResponse.datasource new file mode 100644 index 0000000..5ca7390 --- /dev/null +++ b/MyQianLiMa/Connected Services/ServiceReference1/MyQianLiMa.ServiceReference1.GetPushBaoJing_IsEnableResponse.datasource @@ -0,0 +1,10 @@ + + + + MyQianLiMa.ServiceReference1.GetPushBaoJing_IsEnableResponse, Connected Services.ServiceReference1.Reference.cs.dll, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + \ No newline at end of file diff --git a/MyQianLiMa/Connected Services/ServiceReference1/MyQianLiMa.ServiceReference1.PushBaoJing_IsEnableResponse.datasource b/MyQianLiMa/Connected Services/ServiceReference1/MyQianLiMa.ServiceReference1.PushBaoJing_IsEnableResponse.datasource new file mode 100644 index 0000000..64f9490 --- /dev/null +++ b/MyQianLiMa/Connected Services/ServiceReference1/MyQianLiMa.ServiceReference1.PushBaoJing_IsEnableResponse.datasource @@ -0,0 +1,10 @@ + + + + MyQianLiMa.ServiceReference1.PushBaoJing_IsEnableResponse, Connected Services.ServiceReference1.Reference.cs.dll, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + \ No newline at end of file diff --git a/MyQianLiMa/Connected Services/ServiceReference1/MyQianLiMa.ServiceReference1.RentRoomResponse.datasource b/MyQianLiMa/Connected Services/ServiceReference1/MyQianLiMa.ServiceReference1.RentRoomResponse.datasource new file mode 100644 index 0000000..e6019ef --- /dev/null +++ b/MyQianLiMa/Connected Services/ServiceReference1/MyQianLiMa.ServiceReference1.RentRoomResponse.datasource @@ -0,0 +1,10 @@ + + + + MyQianLiMa.ServiceReference1.RentRoomResponse, Connected Services.ServiceReference1.Reference.cs.dll, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + \ No newline at end of file diff --git a/MyQianLiMa/Connected Services/ServiceReference1/MyQianLiMa.ServiceReference1.UploadPhotoResponse.datasource b/MyQianLiMa/Connected Services/ServiceReference1/MyQianLiMa.ServiceReference1.UploadPhotoResponse.datasource new file mode 100644 index 0000000..2861722 --- /dev/null +++ b/MyQianLiMa/Connected Services/ServiceReference1/MyQianLiMa.ServiceReference1.UploadPhotoResponse.datasource @@ -0,0 +1,10 @@ + + + + MyQianLiMa.ServiceReference1.UploadPhotoResponse, Connected Services.ServiceReference1.Reference.cs.dll, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + \ No newline at end of file diff --git a/MyQianLiMa/Connected Services/ServiceReference1/Reference.cs b/MyQianLiMa/Connected Services/ServiceReference1/Reference.cs new file mode 100644 index 0000000..48e08da --- /dev/null +++ b/MyQianLiMa/Connected Services/ServiceReference1/Reference.cs @@ -0,0 +1,1207 @@ +//------------------------------------------------------------------------------ +// +// 此代码由工具生成。 +// 运行时版本:4.0.30319.42000 +// +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 +// +//------------------------------------------------------------------------------ + +namespace MyQianLiMa.ServiceReference1 { + + + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + [System.ServiceModel.ServiceContractAttribute(Namespace="http://www.blw.com/", ConfigurationName="ServiceReference1.blwwsSoap")] + public interface blwwsSoap { + + [System.ServiceModel.OperationContractAttribute(Action="http://www.blw.com/CheckIn", ReplyAction="*")] + MyQianLiMa.ServiceReference1.CheckInResponse CheckIn(MyQianLiMa.ServiceReference1.CheckInRequest request); + + [System.ServiceModel.OperationContractAttribute(Action="http://www.blw.com/CheckIn", ReplyAction="*")] + System.Threading.Tasks.Task CheckInAsync(MyQianLiMa.ServiceReference1.CheckInRequest request); + + [System.ServiceModel.OperationContractAttribute(Action="http://www.blw.com/CheckIn2", ReplyAction="*")] + MyQianLiMa.ServiceReference1.CheckIn2Response CheckIn2(MyQianLiMa.ServiceReference1.CheckIn2Request request); + + [System.ServiceModel.OperationContractAttribute(Action="http://www.blw.com/CheckIn2", ReplyAction="*")] + System.Threading.Tasks.Task CheckIn2Async(MyQianLiMa.ServiceReference1.CheckIn2Request request); + + [System.ServiceModel.OperationContractAttribute(Action="http://www.blw.com/UploadPhoto", ReplyAction="*")] + MyQianLiMa.ServiceReference1.UploadPhotoResponse UploadPhoto(MyQianLiMa.ServiceReference1.UploadPhotoRequest request); + + [System.ServiceModel.OperationContractAttribute(Action="http://www.blw.com/UploadPhoto", ReplyAction="*")] + System.Threading.Tasks.Task UploadPhotoAsync(MyQianLiMa.ServiceReference1.UploadPhotoRequest request); + + [System.ServiceModel.OperationContractAttribute(Action="http://www.blw.com/ChangePhoneNumber", ReplyAction="*")] + MyQianLiMa.ServiceReference1.ChangePhoneNumberResponse ChangePhoneNumber(MyQianLiMa.ServiceReference1.ChangePhoneNumberRequest request); + + [System.ServiceModel.OperationContractAttribute(Action="http://www.blw.com/ChangePhoneNumber", ReplyAction="*")] + System.Threading.Tasks.Task ChangePhoneNumberAsync(MyQianLiMa.ServiceReference1.ChangePhoneNumberRequest request); + + [System.ServiceModel.OperationContractAttribute(Action="http://www.blw.com/CheckOut", ReplyAction="*")] + MyQianLiMa.ServiceReference1.CheckOutResponse CheckOut(MyQianLiMa.ServiceReference1.CheckOutRequest request); + + [System.ServiceModel.OperationContractAttribute(Action="http://www.blw.com/CheckOut", ReplyAction="*")] + System.Threading.Tasks.Task CheckOutAsync(MyQianLiMa.ServiceReference1.CheckOutRequest request); + + [System.ServiceModel.OperationContractAttribute(Action="http://www.blw.com/RentRoom", ReplyAction="*")] + MyQianLiMa.ServiceReference1.RentRoomResponse RentRoom(MyQianLiMa.ServiceReference1.RentRoomRequest request); + + [System.ServiceModel.OperationContractAttribute(Action="http://www.blw.com/RentRoom", ReplyAction="*")] + System.Threading.Tasks.Task RentRoomAsync(MyQianLiMa.ServiceReference1.RentRoomRequest request); + + // CODEGEN: 命名空间 http://www.blw.com/ 的元素名称 key 以后生成的消息协定未标记为 nillable + [System.ServiceModel.OperationContractAttribute(Action="http://www.blw.com/PushBaoJing_IsEnable", ReplyAction="*")] + MyQianLiMa.ServiceReference1.PushBaoJing_IsEnableResponse PushBaoJing_IsEnable(MyQianLiMa.ServiceReference1.PushBaoJing_IsEnableRequest request); + + [System.ServiceModel.OperationContractAttribute(Action="http://www.blw.com/PushBaoJing_IsEnable", ReplyAction="*")] + System.Threading.Tasks.Task PushBaoJing_IsEnableAsync(MyQianLiMa.ServiceReference1.PushBaoJing_IsEnableRequest request); + + // CODEGEN: 命名空间 http://www.blw.com/ 的元素名称 key 以后生成的消息协定未标记为 nillable + [System.ServiceModel.OperationContractAttribute(Action="http://www.blw.com/GetPushBaoJing_IsEnable", ReplyAction="*")] + MyQianLiMa.ServiceReference1.GetPushBaoJing_IsEnableResponse GetPushBaoJing_IsEnable(MyQianLiMa.ServiceReference1.GetPushBaoJing_IsEnableRequest request); + + [System.ServiceModel.OperationContractAttribute(Action="http://www.blw.com/GetPushBaoJing_IsEnable", ReplyAction="*")] + System.Threading.Tasks.Task GetPushBaoJing_IsEnableAsync(MyQianLiMa.ServiceReference1.GetPushBaoJing_IsEnableRequest request); + + // CODEGEN: 命名空间 http://www.blw.com/ 的元素名称 key 以后生成的消息协定未标记为 nillable + [System.ServiceModel.OperationContractAttribute(Action="http://www.blw.com/AddHotelInfo", ReplyAction="*")] + MyQianLiMa.ServiceReference1.AddHotelInfoResponse AddHotelInfo(MyQianLiMa.ServiceReference1.AddHotelInfoRequest request); + + [System.ServiceModel.OperationContractAttribute(Action="http://www.blw.com/AddHotelInfo", ReplyAction="*")] + System.Threading.Tasks.Task AddHotelInfoAsync(MyQianLiMa.ServiceReference1.AddHotelInfoRequest request); + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + [System.ServiceModel.MessageContractAttribute(IsWrapped=false)] + public partial class CheckInRequest { + + [System.ServiceModel.MessageBodyMemberAttribute(Name="CheckIn", Namespace="http://www.blw.com/", Order=0)] + public MyQianLiMa.ServiceReference1.CheckInRequestBody Body; + + public CheckInRequest() { + } + + public CheckInRequest(MyQianLiMa.ServiceReference1.CheckInRequestBody Body) { + this.Body = Body; + } + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + [System.Runtime.Serialization.DataContractAttribute(Namespace="http://www.blw.com/")] + public partial class CheckInRequestBody { + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=0)] + public string key; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=1)] + public string code; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=2)] + public string roomNumber; + + [System.Runtime.Serialization.DataMemberAttribute(Order=3)] + public System.DateTime checkInDate; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=4)] + public string xmlString; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=5)] + public string errorMsg; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=6)] + public string phoneNumber; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=7)] + public string idNumber; + + public CheckInRequestBody() { + } + + public CheckInRequestBody(string key, string code, string roomNumber, System.DateTime checkInDate, string xmlString, string errorMsg, string phoneNumber, string idNumber) { + this.key = key; + this.code = code; + this.roomNumber = roomNumber; + this.checkInDate = checkInDate; + this.xmlString = xmlString; + this.errorMsg = errorMsg; + this.phoneNumber = phoneNumber; + this.idNumber = idNumber; + } + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + [System.ServiceModel.MessageContractAttribute(IsWrapped=false)] + public partial class CheckInResponse { + + [System.ServiceModel.MessageBodyMemberAttribute(Name="CheckInResponse", Namespace="http://www.blw.com/", Order=0)] + public MyQianLiMa.ServiceReference1.CheckInResponseBody Body; + + public CheckInResponse() { + } + + public CheckInResponse(MyQianLiMa.ServiceReference1.CheckInResponseBody Body) { + this.Body = Body; + } + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + [System.Runtime.Serialization.DataContractAttribute(Namespace="http://www.blw.com/")] + public partial class CheckInResponseBody { + + [System.Runtime.Serialization.DataMemberAttribute(Order=0)] + public bool CheckInResult; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=1)] + public string errorMsg; + + public CheckInResponseBody() { + } + + public CheckInResponseBody(bool CheckInResult, string errorMsg) { + this.CheckInResult = CheckInResult; + this.errorMsg = errorMsg; + } + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + [System.ServiceModel.MessageContractAttribute(IsWrapped=false)] + public partial class CheckIn2Request { + + [System.ServiceModel.MessageBodyMemberAttribute(Name="CheckIn2", Namespace="http://www.blw.com/", Order=0)] + public MyQianLiMa.ServiceReference1.CheckIn2RequestBody Body; + + public CheckIn2Request() { + } + + public CheckIn2Request(MyQianLiMa.ServiceReference1.CheckIn2RequestBody Body) { + this.Body = Body; + } + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + [System.Runtime.Serialization.DataContractAttribute(Namespace="http://www.blw.com/")] + public partial class CheckIn2RequestBody { + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=0)] + public string key; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=1)] + public string code; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=2)] + public string roomNumber; + + [System.Runtime.Serialization.DataMemberAttribute(Order=3)] + public System.DateTime checkInDate; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=4)] + public string xmlString; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=5)] + public string errorMsg; + + [System.Runtime.Serialization.DataMemberAttribute(Order=6)] + public long checkInID; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=7)] + public string phoneNumber; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=8)] + public string idNumber; + + public CheckIn2RequestBody() { + } + + public CheckIn2RequestBody(string key, string code, string roomNumber, System.DateTime checkInDate, string xmlString, string errorMsg, long checkInID, string phoneNumber, string idNumber) { + this.key = key; + this.code = code; + this.roomNumber = roomNumber; + this.checkInDate = checkInDate; + this.xmlString = xmlString; + this.errorMsg = errorMsg; + this.checkInID = checkInID; + this.phoneNumber = phoneNumber; + this.idNumber = idNumber; + } + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + [System.ServiceModel.MessageContractAttribute(IsWrapped=false)] + public partial class CheckIn2Response { + + [System.ServiceModel.MessageBodyMemberAttribute(Name="CheckIn2Response", Namespace="http://www.blw.com/", Order=0)] + public MyQianLiMa.ServiceReference1.CheckIn2ResponseBody Body; + + public CheckIn2Response() { + } + + public CheckIn2Response(MyQianLiMa.ServiceReference1.CheckIn2ResponseBody Body) { + this.Body = Body; + } + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + [System.Runtime.Serialization.DataContractAttribute(Namespace="http://www.blw.com/")] + public partial class CheckIn2ResponseBody { + + [System.Runtime.Serialization.DataMemberAttribute(Order=0)] + public bool CheckIn2Result; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=1)] + public string errorMsg; + + [System.Runtime.Serialization.DataMemberAttribute(Order=2)] + public long checkInID; + + public CheckIn2ResponseBody() { + } + + public CheckIn2ResponseBody(bool CheckIn2Result, string errorMsg, long checkInID) { + this.CheckIn2Result = CheckIn2Result; + this.errorMsg = errorMsg; + this.checkInID = checkInID; + } + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + [System.ServiceModel.MessageContractAttribute(IsWrapped=false)] + public partial class UploadPhotoRequest { + + [System.ServiceModel.MessageBodyMemberAttribute(Name="UploadPhoto", Namespace="http://www.blw.com/", Order=0)] + public MyQianLiMa.ServiceReference1.UploadPhotoRequestBody Body; + + public UploadPhotoRequest() { + } + + public UploadPhotoRequest(MyQianLiMa.ServiceReference1.UploadPhotoRequestBody Body) { + this.Body = Body; + } + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + [System.Runtime.Serialization.DataContractAttribute(Namespace="http://www.blw.com/")] + public partial class UploadPhotoRequestBody { + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=0)] + public string key; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=1)] + public string code; + + [System.Runtime.Serialization.DataMemberAttribute(Order=2)] + public long checkInID; + + [System.Runtime.Serialization.DataMemberAttribute(Order=3)] + public int idType; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=4)] + public string idCard; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=5)] + public string name; + + [System.Runtime.Serialization.DataMemberAttribute(Order=6)] + public int sex; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=7)] + public string birthday; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=8)] + public string photoUrl; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=9)] + public byte[] photo; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=10)] + public string errorMsg; + + public UploadPhotoRequestBody() { + } + + public UploadPhotoRequestBody(string key, string code, long checkInID, int idType, string idCard, string name, int sex, string birthday, string photoUrl, byte[] photo, string errorMsg) { + this.key = key; + this.code = code; + this.checkInID = checkInID; + this.idType = idType; + this.idCard = idCard; + this.name = name; + this.sex = sex; + this.birthday = birthday; + this.photoUrl = photoUrl; + this.photo = photo; + this.errorMsg = errorMsg; + } + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + [System.ServiceModel.MessageContractAttribute(IsWrapped=false)] + public partial class UploadPhotoResponse { + + [System.ServiceModel.MessageBodyMemberAttribute(Name="UploadPhotoResponse", Namespace="http://www.blw.com/", Order=0)] + public MyQianLiMa.ServiceReference1.UploadPhotoResponseBody Body; + + public UploadPhotoResponse() { + } + + public UploadPhotoResponse(MyQianLiMa.ServiceReference1.UploadPhotoResponseBody Body) { + this.Body = Body; + } + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + [System.Runtime.Serialization.DataContractAttribute(Namespace="http://www.blw.com/")] + public partial class UploadPhotoResponseBody { + + [System.Runtime.Serialization.DataMemberAttribute(Order=0)] + public bool UploadPhotoResult; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=1)] + public string errorMsg; + + public UploadPhotoResponseBody() { + } + + public UploadPhotoResponseBody(bool UploadPhotoResult, string errorMsg) { + this.UploadPhotoResult = UploadPhotoResult; + this.errorMsg = errorMsg; + } + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + [System.ServiceModel.MessageContractAttribute(IsWrapped=false)] + public partial class ChangePhoneNumberRequest { + + [System.ServiceModel.MessageBodyMemberAttribute(Name="ChangePhoneNumber", Namespace="http://www.blw.com/", Order=0)] + public MyQianLiMa.ServiceReference1.ChangePhoneNumberRequestBody Body; + + public ChangePhoneNumberRequest() { + } + + public ChangePhoneNumberRequest(MyQianLiMa.ServiceReference1.ChangePhoneNumberRequestBody Body) { + this.Body = Body; + } + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + [System.Runtime.Serialization.DataContractAttribute(Namespace="http://www.blw.com/")] + public partial class ChangePhoneNumberRequestBody { + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=0)] + public string key; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=1)] + public string code; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=2)] + public string roomNumber; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=3)] + public string phoneNumber; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=4)] + public string idNumber; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=5)] + public string errorMsg; + + public ChangePhoneNumberRequestBody() { + } + + public ChangePhoneNumberRequestBody(string key, string code, string roomNumber, string phoneNumber, string idNumber, string errorMsg) { + this.key = key; + this.code = code; + this.roomNumber = roomNumber; + this.phoneNumber = phoneNumber; + this.idNumber = idNumber; + this.errorMsg = errorMsg; + } + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + [System.ServiceModel.MessageContractAttribute(IsWrapped=false)] + public partial class ChangePhoneNumberResponse { + + [System.ServiceModel.MessageBodyMemberAttribute(Name="ChangePhoneNumberResponse", Namespace="http://www.blw.com/", Order=0)] + public MyQianLiMa.ServiceReference1.ChangePhoneNumberResponseBody Body; + + public ChangePhoneNumberResponse() { + } + + public ChangePhoneNumberResponse(MyQianLiMa.ServiceReference1.ChangePhoneNumberResponseBody Body) { + this.Body = Body; + } + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + [System.Runtime.Serialization.DataContractAttribute(Namespace="http://www.blw.com/")] + public partial class ChangePhoneNumberResponseBody { + + [System.Runtime.Serialization.DataMemberAttribute(Order=0)] + public bool ChangePhoneNumberResult; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=1)] + public string errorMsg; + + public ChangePhoneNumberResponseBody() { + } + + public ChangePhoneNumberResponseBody(bool ChangePhoneNumberResult, string errorMsg) { + this.ChangePhoneNumberResult = ChangePhoneNumberResult; + this.errorMsg = errorMsg; + } + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + [System.ServiceModel.MessageContractAttribute(IsWrapped=false)] + public partial class CheckOutRequest { + + [System.ServiceModel.MessageBodyMemberAttribute(Name="CheckOut", Namespace="http://www.blw.com/", Order=0)] + public MyQianLiMa.ServiceReference1.CheckOutRequestBody Body; + + public CheckOutRequest() { + } + + public CheckOutRequest(MyQianLiMa.ServiceReference1.CheckOutRequestBody Body) { + this.Body = Body; + } + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + [System.Runtime.Serialization.DataContractAttribute(Namespace="http://www.blw.com/")] + public partial class CheckOutRequestBody { + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=0)] + public string key; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=1)] + public string code; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=2)] + public string roomNumber; + + [System.Runtime.Serialization.DataMemberAttribute(Order=3)] + public System.DateTime checkOutDate; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=4)] + public string errorMsg; + + public CheckOutRequestBody() { + } + + public CheckOutRequestBody(string key, string code, string roomNumber, System.DateTime checkOutDate, string errorMsg) { + this.key = key; + this.code = code; + this.roomNumber = roomNumber; + this.checkOutDate = checkOutDate; + this.errorMsg = errorMsg; + } + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + [System.ServiceModel.MessageContractAttribute(IsWrapped=false)] + public partial class CheckOutResponse { + + [System.ServiceModel.MessageBodyMemberAttribute(Name="CheckOutResponse", Namespace="http://www.blw.com/", Order=0)] + public MyQianLiMa.ServiceReference1.CheckOutResponseBody Body; + + public CheckOutResponse() { + } + + public CheckOutResponse(MyQianLiMa.ServiceReference1.CheckOutResponseBody Body) { + this.Body = Body; + } + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + [System.Runtime.Serialization.DataContractAttribute(Namespace="http://www.blw.com/")] + public partial class CheckOutResponseBody { + + [System.Runtime.Serialization.DataMemberAttribute(Order=0)] + public bool CheckOutResult; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=1)] + public string errorMsg; + + public CheckOutResponseBody() { + } + + public CheckOutResponseBody(bool CheckOutResult, string errorMsg) { + this.CheckOutResult = CheckOutResult; + this.errorMsg = errorMsg; + } + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + [System.ServiceModel.MessageContractAttribute(IsWrapped=false)] + public partial class RentRoomRequest { + + [System.ServiceModel.MessageBodyMemberAttribute(Name="RentRoom", Namespace="http://www.blw.com/", Order=0)] + public MyQianLiMa.ServiceReference1.RentRoomRequestBody Body; + + public RentRoomRequest() { + } + + public RentRoomRequest(MyQianLiMa.ServiceReference1.RentRoomRequestBody Body) { + this.Body = Body; + } + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + [System.Runtime.Serialization.DataContractAttribute(Namespace="http://www.blw.com/")] + public partial class RentRoomRequestBody { + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=0)] + public string key; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=1)] + public string code; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=2)] + public string roomNumber; + + [System.Runtime.Serialization.DataMemberAttribute(Order=3)] + public System.DateTime rentDate; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=4)] + public string errorMsg; + + public RentRoomRequestBody() { + } + + public RentRoomRequestBody(string key, string code, string roomNumber, System.DateTime rentDate, string errorMsg) { + this.key = key; + this.code = code; + this.roomNumber = roomNumber; + this.rentDate = rentDate; + this.errorMsg = errorMsg; + } + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + [System.ServiceModel.MessageContractAttribute(IsWrapped=false)] + public partial class RentRoomResponse { + + [System.ServiceModel.MessageBodyMemberAttribute(Name="RentRoomResponse", Namespace="http://www.blw.com/", Order=0)] + public MyQianLiMa.ServiceReference1.RentRoomResponseBody Body; + + public RentRoomResponse() { + } + + public RentRoomResponse(MyQianLiMa.ServiceReference1.RentRoomResponseBody Body) { + this.Body = Body; + } + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + [System.Runtime.Serialization.DataContractAttribute(Namespace="http://www.blw.com/")] + public partial class RentRoomResponseBody { + + [System.Runtime.Serialization.DataMemberAttribute(Order=0)] + public bool RentRoomResult; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=1)] + public string errorMsg; + + public RentRoomResponseBody() { + } + + public RentRoomResponseBody(bool RentRoomResult, string errorMsg) { + this.RentRoomResult = RentRoomResult; + this.errorMsg = errorMsg; + } + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + [System.ServiceModel.MessageContractAttribute(IsWrapped=false)] + public partial class PushBaoJing_IsEnableRequest { + + [System.ServiceModel.MessageBodyMemberAttribute(Name="PushBaoJing_IsEnable", Namespace="http://www.blw.com/", Order=0)] + public MyQianLiMa.ServiceReference1.PushBaoJing_IsEnableRequestBody Body; + + public PushBaoJing_IsEnableRequest() { + } + + public PushBaoJing_IsEnableRequest(MyQianLiMa.ServiceReference1.PushBaoJing_IsEnableRequestBody Body) { + this.Body = Body; + } + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + [System.Runtime.Serialization.DataContractAttribute(Namespace="http://www.blw.com/")] + public partial class PushBaoJing_IsEnableRequestBody { + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=0)] + public string key; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=1)] + public string code; + + [System.Runtime.Serialization.DataMemberAttribute(Order=2)] + public bool isable; + + public PushBaoJing_IsEnableRequestBody() { + } + + public PushBaoJing_IsEnableRequestBody(string key, string code, bool isable) { + this.key = key; + this.code = code; + this.isable = isable; + } + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + [System.ServiceModel.MessageContractAttribute(IsWrapped=false)] + public partial class PushBaoJing_IsEnableResponse { + + [System.ServiceModel.MessageBodyMemberAttribute(Name="PushBaoJing_IsEnableResponse", Namespace="http://www.blw.com/", Order=0)] + public MyQianLiMa.ServiceReference1.PushBaoJing_IsEnableResponseBody Body; + + public PushBaoJing_IsEnableResponse() { + } + + public PushBaoJing_IsEnableResponse(MyQianLiMa.ServiceReference1.PushBaoJing_IsEnableResponseBody Body) { + this.Body = Body; + } + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + [System.Runtime.Serialization.DataContractAttribute()] + public partial class PushBaoJing_IsEnableResponseBody { + + public PushBaoJing_IsEnableResponseBody() { + } + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + [System.ServiceModel.MessageContractAttribute(IsWrapped=false)] + public partial class GetPushBaoJing_IsEnableRequest { + + [System.ServiceModel.MessageBodyMemberAttribute(Name="GetPushBaoJing_IsEnable", Namespace="http://www.blw.com/", Order=0)] + public MyQianLiMa.ServiceReference1.GetPushBaoJing_IsEnableRequestBody Body; + + public GetPushBaoJing_IsEnableRequest() { + } + + public GetPushBaoJing_IsEnableRequest(MyQianLiMa.ServiceReference1.GetPushBaoJing_IsEnableRequestBody Body) { + this.Body = Body; + } + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + [System.Runtime.Serialization.DataContractAttribute(Namespace="http://www.blw.com/")] + public partial class GetPushBaoJing_IsEnableRequestBody { + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=0)] + public string key; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=1)] + public string code; + + public GetPushBaoJing_IsEnableRequestBody() { + } + + public GetPushBaoJing_IsEnableRequestBody(string key, string code) { + this.key = key; + this.code = code; + } + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + [System.ServiceModel.MessageContractAttribute(IsWrapped=false)] + public partial class GetPushBaoJing_IsEnableResponse { + + [System.ServiceModel.MessageBodyMemberAttribute(Name="GetPushBaoJing_IsEnableResponse", Namespace="http://www.blw.com/", Order=0)] + public MyQianLiMa.ServiceReference1.GetPushBaoJing_IsEnableResponseBody Body; + + public GetPushBaoJing_IsEnableResponse() { + } + + public GetPushBaoJing_IsEnableResponse(MyQianLiMa.ServiceReference1.GetPushBaoJing_IsEnableResponseBody Body) { + this.Body = Body; + } + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + [System.Runtime.Serialization.DataContractAttribute(Namespace="http://www.blw.com/")] + public partial class GetPushBaoJing_IsEnableResponseBody { + + [System.Runtime.Serialization.DataMemberAttribute(Order=0)] + public int GetPushBaoJing_IsEnableResult; + + public GetPushBaoJing_IsEnableResponseBody() { + } + + public GetPushBaoJing_IsEnableResponseBody(int GetPushBaoJing_IsEnableResult) { + this.GetPushBaoJing_IsEnableResult = GetPushBaoJing_IsEnableResult; + } + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + [System.ServiceModel.MessageContractAttribute(IsWrapped=false)] + public partial class AddHotelInfoRequest { + + [System.ServiceModel.MessageBodyMemberAttribute(Name="AddHotelInfo", Namespace="http://www.blw.com/", Order=0)] + public MyQianLiMa.ServiceReference1.AddHotelInfoRequestBody Body; + + public AddHotelInfoRequest() { + } + + public AddHotelInfoRequest(MyQianLiMa.ServiceReference1.AddHotelInfoRequestBody Body) { + this.Body = Body; + } + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + [System.Runtime.Serialization.DataContractAttribute(Namespace="http://www.blw.com/")] + public partial class AddHotelInfoRequestBody { + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=0)] + public string key; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=1)] + public string Code; + + [System.Runtime.Serialization.DataMemberAttribute(EmitDefaultValue=false, Order=2)] + public string HotelName; + + [System.Runtime.Serialization.DataMemberAttribute(Order=3)] + public int HotelId; + + public AddHotelInfoRequestBody() { + } + + public AddHotelInfoRequestBody(string key, string Code, string HotelName, int HotelId) { + this.key = key; + this.Code = Code; + this.HotelName = HotelName; + this.HotelId = HotelId; + } + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + [System.ServiceModel.MessageContractAttribute(IsWrapped=false)] + public partial class AddHotelInfoResponse { + + [System.ServiceModel.MessageBodyMemberAttribute(Name="AddHotelInfoResponse", Namespace="http://www.blw.com/", Order=0)] + public MyQianLiMa.ServiceReference1.AddHotelInfoResponseBody Body; + + public AddHotelInfoResponse() { + } + + public AddHotelInfoResponse(MyQianLiMa.ServiceReference1.AddHotelInfoResponseBody Body) { + this.Body = Body; + } + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + [System.Runtime.Serialization.DataContractAttribute(Namespace="http://www.blw.com/")] + public partial class AddHotelInfoResponseBody { + + [System.Runtime.Serialization.DataMemberAttribute(Order=0)] + public int AddHotelInfoResult; + + public AddHotelInfoResponseBody() { + } + + public AddHotelInfoResponseBody(int AddHotelInfoResult) { + this.AddHotelInfoResult = AddHotelInfoResult; + } + } + + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + public interface blwwsSoapChannel : MyQianLiMa.ServiceReference1.blwwsSoap, System.ServiceModel.IClientChannel { + } + + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] + public partial class blwwsSoapClient : System.ServiceModel.ClientBase, MyQianLiMa.ServiceReference1.blwwsSoap { + + public blwwsSoapClient() { + } + + public blwwsSoapClient(string endpointConfigurationName) : + base(endpointConfigurationName) { + } + + public blwwsSoapClient(string endpointConfigurationName, string remoteAddress) : + base(endpointConfigurationName, remoteAddress) { + } + + public blwwsSoapClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) : + base(endpointConfigurationName, remoteAddress) { + } + + public blwwsSoapClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) : + base(binding, remoteAddress) { + } + + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + MyQianLiMa.ServiceReference1.CheckInResponse MyQianLiMa.ServiceReference1.blwwsSoap.CheckIn(MyQianLiMa.ServiceReference1.CheckInRequest request) { + return base.Channel.CheckIn(request); + } + + public bool CheckIn(string key, string code, string roomNumber, System.DateTime checkInDate, string xmlString, ref string errorMsg, string phoneNumber, string idNumber) { + MyQianLiMa.ServiceReference1.CheckInRequest inValue = new MyQianLiMa.ServiceReference1.CheckInRequest(); + inValue.Body = new MyQianLiMa.ServiceReference1.CheckInRequestBody(); + inValue.Body.key = key; + inValue.Body.code = code; + inValue.Body.roomNumber = roomNumber; + inValue.Body.checkInDate = checkInDate; + inValue.Body.xmlString = xmlString; + inValue.Body.errorMsg = errorMsg; + inValue.Body.phoneNumber = phoneNumber; + inValue.Body.idNumber = idNumber; + MyQianLiMa.ServiceReference1.CheckInResponse retVal = ((MyQianLiMa.ServiceReference1.blwwsSoap)(this)).CheckIn(inValue); + errorMsg = retVal.Body.errorMsg; + return retVal.Body.CheckInResult; + } + + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + System.Threading.Tasks.Task MyQianLiMa.ServiceReference1.blwwsSoap.CheckInAsync(MyQianLiMa.ServiceReference1.CheckInRequest request) { + return base.Channel.CheckInAsync(request); + } + + public System.Threading.Tasks.Task CheckInAsync(string key, string code, string roomNumber, System.DateTime checkInDate, string xmlString, string errorMsg, string phoneNumber, string idNumber) { + MyQianLiMa.ServiceReference1.CheckInRequest inValue = new MyQianLiMa.ServiceReference1.CheckInRequest(); + inValue.Body = new MyQianLiMa.ServiceReference1.CheckInRequestBody(); + inValue.Body.key = key; + inValue.Body.code = code; + inValue.Body.roomNumber = roomNumber; + inValue.Body.checkInDate = checkInDate; + inValue.Body.xmlString = xmlString; + inValue.Body.errorMsg = errorMsg; + inValue.Body.phoneNumber = phoneNumber; + inValue.Body.idNumber = idNumber; + return ((MyQianLiMa.ServiceReference1.blwwsSoap)(this)).CheckInAsync(inValue); + } + + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + MyQianLiMa.ServiceReference1.CheckIn2Response MyQianLiMa.ServiceReference1.blwwsSoap.CheckIn2(MyQianLiMa.ServiceReference1.CheckIn2Request request) { + return base.Channel.CheckIn2(request); + } + + public bool CheckIn2(string key, string code, string roomNumber, System.DateTime checkInDate, string xmlString, ref string errorMsg, ref long checkInID, string phoneNumber, string idNumber) { + MyQianLiMa.ServiceReference1.CheckIn2Request inValue = new MyQianLiMa.ServiceReference1.CheckIn2Request(); + inValue.Body = new MyQianLiMa.ServiceReference1.CheckIn2RequestBody(); + inValue.Body.key = key; + inValue.Body.code = code; + inValue.Body.roomNumber = roomNumber; + inValue.Body.checkInDate = checkInDate; + inValue.Body.xmlString = xmlString; + inValue.Body.errorMsg = errorMsg; + inValue.Body.checkInID = checkInID; + inValue.Body.phoneNumber = phoneNumber; + inValue.Body.idNumber = idNumber; + MyQianLiMa.ServiceReference1.CheckIn2Response retVal = ((MyQianLiMa.ServiceReference1.blwwsSoap)(this)).CheckIn2(inValue); + errorMsg = retVal.Body.errorMsg; + checkInID = retVal.Body.checkInID; + return retVal.Body.CheckIn2Result; + } + + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + System.Threading.Tasks.Task MyQianLiMa.ServiceReference1.blwwsSoap.CheckIn2Async(MyQianLiMa.ServiceReference1.CheckIn2Request request) { + return base.Channel.CheckIn2Async(request); + } + + public System.Threading.Tasks.Task CheckIn2Async(string key, string code, string roomNumber, System.DateTime checkInDate, string xmlString, string errorMsg, long checkInID, string phoneNumber, string idNumber) { + MyQianLiMa.ServiceReference1.CheckIn2Request inValue = new MyQianLiMa.ServiceReference1.CheckIn2Request(); + inValue.Body = new MyQianLiMa.ServiceReference1.CheckIn2RequestBody(); + inValue.Body.key = key; + inValue.Body.code = code; + inValue.Body.roomNumber = roomNumber; + inValue.Body.checkInDate = checkInDate; + inValue.Body.xmlString = xmlString; + inValue.Body.errorMsg = errorMsg; + inValue.Body.checkInID = checkInID; + inValue.Body.phoneNumber = phoneNumber; + inValue.Body.idNumber = idNumber; + return ((MyQianLiMa.ServiceReference1.blwwsSoap)(this)).CheckIn2Async(inValue); + } + + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + MyQianLiMa.ServiceReference1.UploadPhotoResponse MyQianLiMa.ServiceReference1.blwwsSoap.UploadPhoto(MyQianLiMa.ServiceReference1.UploadPhotoRequest request) { + return base.Channel.UploadPhoto(request); + } + + public bool UploadPhoto(string key, string code, long checkInID, int idType, string idCard, string name, int sex, string birthday, string photoUrl, byte[] photo, ref string errorMsg) { + MyQianLiMa.ServiceReference1.UploadPhotoRequest inValue = new MyQianLiMa.ServiceReference1.UploadPhotoRequest(); + inValue.Body = new MyQianLiMa.ServiceReference1.UploadPhotoRequestBody(); + inValue.Body.key = key; + inValue.Body.code = code; + inValue.Body.checkInID = checkInID; + inValue.Body.idType = idType; + inValue.Body.idCard = idCard; + inValue.Body.name = name; + inValue.Body.sex = sex; + inValue.Body.birthday = birthday; + inValue.Body.photoUrl = photoUrl; + inValue.Body.photo = photo; + inValue.Body.errorMsg = errorMsg; + MyQianLiMa.ServiceReference1.UploadPhotoResponse retVal = ((MyQianLiMa.ServiceReference1.blwwsSoap)(this)).UploadPhoto(inValue); + errorMsg = retVal.Body.errorMsg; + return retVal.Body.UploadPhotoResult; + } + + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + System.Threading.Tasks.Task MyQianLiMa.ServiceReference1.blwwsSoap.UploadPhotoAsync(MyQianLiMa.ServiceReference1.UploadPhotoRequest request) { + return base.Channel.UploadPhotoAsync(request); + } + + public System.Threading.Tasks.Task UploadPhotoAsync(string key, string code, long checkInID, int idType, string idCard, string name, int sex, string birthday, string photoUrl, byte[] photo, string errorMsg) { + MyQianLiMa.ServiceReference1.UploadPhotoRequest inValue = new MyQianLiMa.ServiceReference1.UploadPhotoRequest(); + inValue.Body = new MyQianLiMa.ServiceReference1.UploadPhotoRequestBody(); + inValue.Body.key = key; + inValue.Body.code = code; + inValue.Body.checkInID = checkInID; + inValue.Body.idType = idType; + inValue.Body.idCard = idCard; + inValue.Body.name = name; + inValue.Body.sex = sex; + inValue.Body.birthday = birthday; + inValue.Body.photoUrl = photoUrl; + inValue.Body.photo = photo; + inValue.Body.errorMsg = errorMsg; + return ((MyQianLiMa.ServiceReference1.blwwsSoap)(this)).UploadPhotoAsync(inValue); + } + + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + MyQianLiMa.ServiceReference1.ChangePhoneNumberResponse MyQianLiMa.ServiceReference1.blwwsSoap.ChangePhoneNumber(MyQianLiMa.ServiceReference1.ChangePhoneNumberRequest request) { + return base.Channel.ChangePhoneNumber(request); + } + + public bool ChangePhoneNumber(string key, string code, string roomNumber, string phoneNumber, string idNumber, ref string errorMsg) { + MyQianLiMa.ServiceReference1.ChangePhoneNumberRequest inValue = new MyQianLiMa.ServiceReference1.ChangePhoneNumberRequest(); + inValue.Body = new MyQianLiMa.ServiceReference1.ChangePhoneNumberRequestBody(); + inValue.Body.key = key; + inValue.Body.code = code; + inValue.Body.roomNumber = roomNumber; + inValue.Body.phoneNumber = phoneNumber; + inValue.Body.idNumber = idNumber; + inValue.Body.errorMsg = errorMsg; + MyQianLiMa.ServiceReference1.ChangePhoneNumberResponse retVal = ((MyQianLiMa.ServiceReference1.blwwsSoap)(this)).ChangePhoneNumber(inValue); + errorMsg = retVal.Body.errorMsg; + return retVal.Body.ChangePhoneNumberResult; + } + + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + System.Threading.Tasks.Task MyQianLiMa.ServiceReference1.blwwsSoap.ChangePhoneNumberAsync(MyQianLiMa.ServiceReference1.ChangePhoneNumberRequest request) { + return base.Channel.ChangePhoneNumberAsync(request); + } + + public System.Threading.Tasks.Task ChangePhoneNumberAsync(string key, string code, string roomNumber, string phoneNumber, string idNumber, string errorMsg) { + MyQianLiMa.ServiceReference1.ChangePhoneNumberRequest inValue = new MyQianLiMa.ServiceReference1.ChangePhoneNumberRequest(); + inValue.Body = new MyQianLiMa.ServiceReference1.ChangePhoneNumberRequestBody(); + inValue.Body.key = key; + inValue.Body.code = code; + inValue.Body.roomNumber = roomNumber; + inValue.Body.phoneNumber = phoneNumber; + inValue.Body.idNumber = idNumber; + inValue.Body.errorMsg = errorMsg; + return ((MyQianLiMa.ServiceReference1.blwwsSoap)(this)).ChangePhoneNumberAsync(inValue); + } + + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + MyQianLiMa.ServiceReference1.CheckOutResponse MyQianLiMa.ServiceReference1.blwwsSoap.CheckOut(MyQianLiMa.ServiceReference1.CheckOutRequest request) { + return base.Channel.CheckOut(request); + } + + public bool CheckOut(string key, string code, string roomNumber, System.DateTime checkOutDate, ref string errorMsg) { + MyQianLiMa.ServiceReference1.CheckOutRequest inValue = new MyQianLiMa.ServiceReference1.CheckOutRequest(); + inValue.Body = new MyQianLiMa.ServiceReference1.CheckOutRequestBody(); + inValue.Body.key = key; + inValue.Body.code = code; + inValue.Body.roomNumber = roomNumber; + inValue.Body.checkOutDate = checkOutDate; + inValue.Body.errorMsg = errorMsg; + MyQianLiMa.ServiceReference1.CheckOutResponse retVal = ((MyQianLiMa.ServiceReference1.blwwsSoap)(this)).CheckOut(inValue); + errorMsg = retVal.Body.errorMsg; + return retVal.Body.CheckOutResult; + } + + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + System.Threading.Tasks.Task MyQianLiMa.ServiceReference1.blwwsSoap.CheckOutAsync(MyQianLiMa.ServiceReference1.CheckOutRequest request) { + return base.Channel.CheckOutAsync(request); + } + + public System.Threading.Tasks.Task CheckOutAsync(string key, string code, string roomNumber, System.DateTime checkOutDate, string errorMsg) { + MyQianLiMa.ServiceReference1.CheckOutRequest inValue = new MyQianLiMa.ServiceReference1.CheckOutRequest(); + inValue.Body = new MyQianLiMa.ServiceReference1.CheckOutRequestBody(); + inValue.Body.key = key; + inValue.Body.code = code; + inValue.Body.roomNumber = roomNumber; + inValue.Body.checkOutDate = checkOutDate; + inValue.Body.errorMsg = errorMsg; + return ((MyQianLiMa.ServiceReference1.blwwsSoap)(this)).CheckOutAsync(inValue); + } + + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + MyQianLiMa.ServiceReference1.RentRoomResponse MyQianLiMa.ServiceReference1.blwwsSoap.RentRoom(MyQianLiMa.ServiceReference1.RentRoomRequest request) { + return base.Channel.RentRoom(request); + } + + public bool RentRoom(string key, string code, string roomNumber, System.DateTime rentDate, ref string errorMsg) { + MyQianLiMa.ServiceReference1.RentRoomRequest inValue = new MyQianLiMa.ServiceReference1.RentRoomRequest(); + inValue.Body = new MyQianLiMa.ServiceReference1.RentRoomRequestBody(); + inValue.Body.key = key; + inValue.Body.code = code; + inValue.Body.roomNumber = roomNumber; + inValue.Body.rentDate = rentDate; + inValue.Body.errorMsg = errorMsg; + MyQianLiMa.ServiceReference1.RentRoomResponse retVal = ((MyQianLiMa.ServiceReference1.blwwsSoap)(this)).RentRoom(inValue); + errorMsg = retVal.Body.errorMsg; + return retVal.Body.RentRoomResult; + } + + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + System.Threading.Tasks.Task MyQianLiMa.ServiceReference1.blwwsSoap.RentRoomAsync(MyQianLiMa.ServiceReference1.RentRoomRequest request) { + return base.Channel.RentRoomAsync(request); + } + + public System.Threading.Tasks.Task RentRoomAsync(string key, string code, string roomNumber, System.DateTime rentDate, string errorMsg) { + MyQianLiMa.ServiceReference1.RentRoomRequest inValue = new MyQianLiMa.ServiceReference1.RentRoomRequest(); + inValue.Body = new MyQianLiMa.ServiceReference1.RentRoomRequestBody(); + inValue.Body.key = key; + inValue.Body.code = code; + inValue.Body.roomNumber = roomNumber; + inValue.Body.rentDate = rentDate; + inValue.Body.errorMsg = errorMsg; + return ((MyQianLiMa.ServiceReference1.blwwsSoap)(this)).RentRoomAsync(inValue); + } + + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + MyQianLiMa.ServiceReference1.PushBaoJing_IsEnableResponse MyQianLiMa.ServiceReference1.blwwsSoap.PushBaoJing_IsEnable(MyQianLiMa.ServiceReference1.PushBaoJing_IsEnableRequest request) { + return base.Channel.PushBaoJing_IsEnable(request); + } + + public void PushBaoJing_IsEnable(string key, string code, bool isable) { + MyQianLiMa.ServiceReference1.PushBaoJing_IsEnableRequest inValue = new MyQianLiMa.ServiceReference1.PushBaoJing_IsEnableRequest(); + inValue.Body = new MyQianLiMa.ServiceReference1.PushBaoJing_IsEnableRequestBody(); + inValue.Body.key = key; + inValue.Body.code = code; + inValue.Body.isable = isable; + MyQianLiMa.ServiceReference1.PushBaoJing_IsEnableResponse retVal = ((MyQianLiMa.ServiceReference1.blwwsSoap)(this)).PushBaoJing_IsEnable(inValue); + } + + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + System.Threading.Tasks.Task MyQianLiMa.ServiceReference1.blwwsSoap.PushBaoJing_IsEnableAsync(MyQianLiMa.ServiceReference1.PushBaoJing_IsEnableRequest request) { + return base.Channel.PushBaoJing_IsEnableAsync(request); + } + + public System.Threading.Tasks.Task PushBaoJing_IsEnableAsync(string key, string code, bool isable) { + MyQianLiMa.ServiceReference1.PushBaoJing_IsEnableRequest inValue = new MyQianLiMa.ServiceReference1.PushBaoJing_IsEnableRequest(); + inValue.Body = new MyQianLiMa.ServiceReference1.PushBaoJing_IsEnableRequestBody(); + inValue.Body.key = key; + inValue.Body.code = code; + inValue.Body.isable = isable; + return ((MyQianLiMa.ServiceReference1.blwwsSoap)(this)).PushBaoJing_IsEnableAsync(inValue); + } + + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + MyQianLiMa.ServiceReference1.GetPushBaoJing_IsEnableResponse MyQianLiMa.ServiceReference1.blwwsSoap.GetPushBaoJing_IsEnable(MyQianLiMa.ServiceReference1.GetPushBaoJing_IsEnableRequest request) { + return base.Channel.GetPushBaoJing_IsEnable(request); + } + + public int GetPushBaoJing_IsEnable(string key, string code) { + MyQianLiMa.ServiceReference1.GetPushBaoJing_IsEnableRequest inValue = new MyQianLiMa.ServiceReference1.GetPushBaoJing_IsEnableRequest(); + inValue.Body = new MyQianLiMa.ServiceReference1.GetPushBaoJing_IsEnableRequestBody(); + inValue.Body.key = key; + inValue.Body.code = code; + MyQianLiMa.ServiceReference1.GetPushBaoJing_IsEnableResponse retVal = ((MyQianLiMa.ServiceReference1.blwwsSoap)(this)).GetPushBaoJing_IsEnable(inValue); + return retVal.Body.GetPushBaoJing_IsEnableResult; + } + + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + System.Threading.Tasks.Task MyQianLiMa.ServiceReference1.blwwsSoap.GetPushBaoJing_IsEnableAsync(MyQianLiMa.ServiceReference1.GetPushBaoJing_IsEnableRequest request) { + return base.Channel.GetPushBaoJing_IsEnableAsync(request); + } + + public System.Threading.Tasks.Task GetPushBaoJing_IsEnableAsync(string key, string code) { + MyQianLiMa.ServiceReference1.GetPushBaoJing_IsEnableRequest inValue = new MyQianLiMa.ServiceReference1.GetPushBaoJing_IsEnableRequest(); + inValue.Body = new MyQianLiMa.ServiceReference1.GetPushBaoJing_IsEnableRequestBody(); + inValue.Body.key = key; + inValue.Body.code = code; + return ((MyQianLiMa.ServiceReference1.blwwsSoap)(this)).GetPushBaoJing_IsEnableAsync(inValue); + } + + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + MyQianLiMa.ServiceReference1.AddHotelInfoResponse MyQianLiMa.ServiceReference1.blwwsSoap.AddHotelInfo(MyQianLiMa.ServiceReference1.AddHotelInfoRequest request) { + return base.Channel.AddHotelInfo(request); + } + + public int AddHotelInfo(string key, string Code, string HotelName, int HotelId) { + MyQianLiMa.ServiceReference1.AddHotelInfoRequest inValue = new MyQianLiMa.ServiceReference1.AddHotelInfoRequest(); + inValue.Body = new MyQianLiMa.ServiceReference1.AddHotelInfoRequestBody(); + inValue.Body.key = key; + inValue.Body.Code = Code; + inValue.Body.HotelName = HotelName; + inValue.Body.HotelId = HotelId; + MyQianLiMa.ServiceReference1.AddHotelInfoResponse retVal = ((MyQianLiMa.ServiceReference1.blwwsSoap)(this)).AddHotelInfo(inValue); + return retVal.Body.AddHotelInfoResult; + } + + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + System.Threading.Tasks.Task MyQianLiMa.ServiceReference1.blwwsSoap.AddHotelInfoAsync(MyQianLiMa.ServiceReference1.AddHotelInfoRequest request) { + return base.Channel.AddHotelInfoAsync(request); + } + + public System.Threading.Tasks.Task AddHotelInfoAsync(string key, string Code, string HotelName, int HotelId) { + MyQianLiMa.ServiceReference1.AddHotelInfoRequest inValue = new MyQianLiMa.ServiceReference1.AddHotelInfoRequest(); + inValue.Body = new MyQianLiMa.ServiceReference1.AddHotelInfoRequestBody(); + inValue.Body.key = key; + inValue.Body.Code = Code; + inValue.Body.HotelName = HotelName; + inValue.Body.HotelId = HotelId; + return ((MyQianLiMa.ServiceReference1.blwwsSoap)(this)).AddHotelInfoAsync(inValue); + } + } +} diff --git a/MyQianLiMa/Connected Services/ServiceReference1/Reference.svcmap b/MyQianLiMa/Connected Services/ServiceReference1/Reference.svcmap new file mode 100644 index 0000000..6fe2f06 --- /dev/null +++ b/MyQianLiMa/Connected Services/ServiceReference1/Reference.svcmap @@ -0,0 +1,32 @@ + + + + false + true + true + + false + false + false + + + true + Auto + true + true + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/MyQianLiMa/Connected Services/ServiceReference1/blwws.disco b/MyQianLiMa/Connected Services/ServiceReference1/blwws.disco new file mode 100644 index 0000000..902126d --- /dev/null +++ b/MyQianLiMa/Connected Services/ServiceReference1/blwws.disco @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/MyQianLiMa/Connected Services/ServiceReference1/blwws.wsdl b/MyQianLiMa/Connected Services/ServiceReference1/blwws.wsdl new file mode 100644 index 0000000..2599959 --- /dev/null +++ b/MyQianLiMa/Connected Services/ServiceReference1/blwws.wsdl @@ -0,0 +1,456 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 开房<br/>key:验证码(我方提供),code:编码(我方提供),roomNumber:房号,checkInDate:入住日期,xmlString:客人信息,errorMsg:返回错误信息,phoneNumber:手机号码(多个以英文逗号,隔开),idNumber:身份证号(多个以英文逗号,隔开):获取微信登录验证码 + + + + + 开房<br/>key:验证码(我方提供),code:编码(我方提供),roomNumber:房号,checkInDate:入住日期,xmlString:客人信息,errorMsg:返回错误信息,checkInID:返回入住记录ID,phoneNumber:手机号码(多个以英文逗号,隔开),idNumber:身份证号(多个以英文逗号,隔开):获取微信登录验证码 + + + + + 上传入住人信息<br/>key:验证码(我方提供),code:编码(我方提供),checkInID:入住记录ID,idType:证件类型(0身份证,1护照,2军官证,3其他),idCard:证件号码,name:姓名,sex:性别(0女,1男,2其他),birthday:出生日期(1999-01-01),photoUrl:图片路径(与photo二选一),photo:图片(二进制),errorMsg:错误信息 + + + + + 变更手机号<br/>key:验证码(我方提供),code:编码(我方提供),roomNumber:房号,errorMsg:错误信息,phoneNumber:手机号码(多个以英文逗号,隔开),idNumber:身份证号:获取验证码 + + + + + 退房<br/>key:验证码(我方提供),code:编码(我方提供),roomNumber:房号,checkOutDate:退房日期,errorMsg:错误信息 + + + + + 待租<br/>key:验证码(我方提供),code:编码(我方提供),roomNumber:房号,rentDate:变更待租日期,errorMsg:错误信息 + + + + + 推送数据到宝镜 + + + + + 获取是否推送PMS数据到宝镜 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/MyQianLiMa/Connected Services/ServiceReference1/configuration.svcinfo b/MyQianLiMa/Connected Services/ServiceReference1/configuration.svcinfo new file mode 100644 index 0000000..0190c6d --- /dev/null +++ b/MyQianLiMa/Connected Services/ServiceReference1/configuration.svcinfo @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/MyQianLiMa/Connected Services/ServiceReference1/configuration91.svcinfo b/MyQianLiMa/Connected Services/ServiceReference1/configuration91.svcinfo new file mode 100644 index 0000000..41a2a83 --- /dev/null +++ b/MyQianLiMa/Connected Services/ServiceReference1/configuration91.svcinfo @@ -0,0 +1,201 @@ + + + + + + + blwwsSoap + + + + + + + + + + + + + + + + + + + + + StrongWildcard + + + + + + 65536 + + + + + + + + + System.ServiceModel.Configuration.XmlDictionaryReaderQuotasElement + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + System.Text.UTF8Encoding + + + Buffered + + + + + + Text + + + System.ServiceModel.Configuration.BasicHttpSecurityElement + + + None + + + System.ServiceModel.Configuration.HttpTransportSecurityElement + + + None + + + None + + + System.Security.Authentication.ExtendedProtection.Configuration.ExtendedProtectionPolicyElement + + + Never + + + TransportSelected + + + (集合) + + + + + + System.ServiceModel.Configuration.BasicHttpMessageSecurityElement + + + UserName + + + Default + + + + + + + + + http://pms.boonlive-rcu.com:89/blwws.asmx + + + + + + basicHttpBinding + + + blwwsSoap + + + ServiceReference1.blwwsSoap + + + System.ServiceModel.Configuration.AddressHeaderCollectionElement + + + <Header /> + + + System.ServiceModel.Configuration.IdentityElement + + + System.ServiceModel.Configuration.UserPrincipalNameElement + + + + + + System.ServiceModel.Configuration.ServicePrincipalNameElement + + + + + + System.ServiceModel.Configuration.DnsElement + + + + + + System.ServiceModel.Configuration.RsaElement + + + + + + System.ServiceModel.Configuration.CertificateElement + + + + + + System.ServiceModel.Configuration.CertificateReferenceElement + + + My + + + LocalMachine + + + FindBySubjectDistinguishedName + + + + + + False + + + blwwsSoap + + + + + + + + + + + \ No newline at end of file diff --git a/MyQianLiMa/Controllers/ValuesController.cs b/MyQianLiMa/Controllers/ValuesController.cs new file mode 100644 index 0000000..67a4fe4 --- /dev/null +++ b/MyQianLiMa/Controllers/ValuesController.cs @@ -0,0 +1,60 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Web; +using System.Web.Http; +using BLWWS.PMS; + +namespace MoNi_QianLiMa.Controller +{ + public class ValuesController : ApiController + { + [HttpPost()] + public string PostData(string hotelcode, string add_or_remove) + { + string msg = ""; + try + { + var q = HttpContext.Current.Application["config"]; + var D = (ConfigData)q; + + if (add_or_remove.Equals("add")) + { + D.DuiJieInfos.RemoveAll(A=>A.hotel_code.Equals(hotelcode)); + + DuiJieInfo ddd = new DuiJieInfo(); + ddd.hotel_code = hotelcode; + D.DuiJieInfos.Add(ddd); + } + else if (add_or_remove.Equals("remove")) + { + D.DuiJieInfos.RemoveAll(A => A.hotel_code.Equals(hotelcode)); + } + + string str = Newtonsoft.Json.JsonConvert.SerializeObject(D); + //var filepath = Path.Combine(Directory.GetCurrentDirectory(), "config.json"); + string filepath1 = HttpContext.Current.Server.MapPath("~/config.json"); + File.WriteAllText(filepath1, str); + msg = "sucess"; + } + catch (Exception ex) + { + msg = ex.Message; + } + return msg; + + } + + [HttpPost()] + public string PostDataOne() + { + return "hello"; + } + public void SaveData2File() + { + } + } +} \ No newline at end of file diff --git a/MyQianLiMa/Global.asax b/MyQianLiMa/Global.asax new file mode 100644 index 0000000..7b87d04 --- /dev/null +++ b/MyQianLiMa/Global.asax @@ -0,0 +1 @@ +<%@ Application Codebehind="Global.asax.cs" Inherits="MyQianLiMa.Global" Language="C#" %> diff --git a/MyQianLiMa/Global.asax.cs b/MyQianLiMa/Global.asax.cs new file mode 100644 index 0000000..25c42ff --- /dev/null +++ b/MyQianLiMa/Global.asax.cs @@ -0,0 +1,401 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; +using System.Web.Routing; +using System.Web.Security; +using System.Web.SessionState; +using System.Web.Http; +using System.Xml.Linq; +using System.Threading.Tasks; +using RestSharp; +using System.Configuration; +using Newtonsoft.Json; +using BLWWS.PMS; +using System.Collections.Concurrent; +using BLWWS.PMS.Common; +using Microsoft.Extensions.Logging; +using NLog; +using System.IO; +using System.Text; +using Quartz.Impl; +using Quartz; +using MoNi_QianLiMa.Job; + +namespace MyQianLiMa +{ + public class Global : HttpApplication + { + private readonly Logger _logger = LogManager.GetCurrentClassLogger(); + public static ConcurrentDictionary GlobalData { get; } + = new ConcurrentDictionary(); + + System.Timers.Timer timer; + System.Timers.Timer token_timer; + void Application_Start(object sender, EventArgs e) + { + // 在应用程序启动时运行的代码 + GlobalConfiguration.Configure(WebApiConfig.Register); + + try + { + string filepath = Server.MapPath("config.json"); + string str = File.ReadAllText(filepath, Encoding.UTF8); + var d = JsonConvert.DeserializeObject(str); + Application.Add("config", d); + + //获取token数据 + //token_timer = new System.Timers.Timer(); + //token_timer.Interval = 30 * 60 * 1000; + //token_timer.Elapsed += Token_timer_Elapsed; ; + //token_timer.Start(); + + GetTokenData().Wait(); + + //获取实际上的数据 + timer = new System.Timers.Timer(); + timer.Interval = 30 * 1000; + timer.Elapsed += Timer_Elapsed; + timer.Start(); + + } + catch (Exception ex) + { + _logger.Error("Application_start: " + ex.Message); + } + + try + { + StdSchedulerFactory factory = new StdSchedulerFactory(); + IScheduler scheduler = factory.GetScheduler().Result;//Scheduler:调度程序 + + + // 启动任务调度器 + scheduler.Start().Wait(); + string jobKey = "Get_Token"; + IJobDetail jobDetail = JobBuilder.Create() + .WithIdentity(jobKey) + .UsingJobData("RequestUrl", "nouser") + .Build(); + + ITrigger trigger = TriggerBuilder.Create() + .WithIdentity("GetTokenData") + .StartNow() + .WithSimpleSchedule(x => + { + x.WithIntervalInMinutes(20).RepeatForever(); + //x.WithIntervalInSeconds(5).RepeatForever(); + //x.WithIntervalInHours(1).RepeatForever(); + }) + .Build(); + + scheduler.ScheduleJob(jobDetail, trigger).Wait(); + + } + catch (Exception ex) + { + _logger.Error("Application_start: " + ex.Message); + } + } + + + + + public static string BaseUrl = ConfigurationManager.AppSettings["qianlima_httpurl"]; + public static string UserCode = ConfigurationManager.AppSettings["UserCode"]; + public static string UserKey = ConfigurationManager.AppSettings["UserKey"]; + private static readonly string _key = ConfigurationManager.AppSettings["key"]; + public static string qianlima_orgUnitNo = ConfigurationManager.AppSettings["qianlima_orgUnitNo"]; + + private async void Token_timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) + { + try + { + await GetTokenData(); + } + catch (Exception ex) + { + _logger.Error("GetToken: " + ex.Message); + } + } + + public static string QianLiMa_LoginToken = "qianlima_token"; + + public static string QianLiMa_DingDan = "qianlima_order"; + public async Task GetTokenData() + { + //Dictionary Params = new Dictionary(); + //Params.Add("userCode", UserCode); + //Params.Add("key", UserKey); + //var tokenstr = await Send_Http_Request_Params("/iPMSAPI/iPMSApiService/api/applySecurityToken", Params); + //if (!string.IsNullOrEmpty(tokenstr)) + //{ + // var dic = JsonConvert.DeserializeObject>(tokenstr); + // string token = dic["securityToken"]; + // Application.Add(QianLiMa_LoginToken, token); + //} + string token = await GetToken_G(); + if (!string.IsNullOrEmpty(token)) + { + GlobalData.AddOrUpdate(QianLiMa_LoginToken, token, (k, v) => + { + return token; + }); + //Application.Add(QianLiMa_LoginToken, token); + } + } + public static async Task GetToken_G() + { + Dictionary Params = new Dictionary(); + Params.Add("userCode", UserCode); + Params.Add("key", UserKey); + + var tokenstr = await Send_Http_Request_Params("/iPMSAPI/iPMSApiService/api/applySecurityToken", Params); + + if (!string.IsNullOrEmpty(tokenstr)) + { + var dic = JsonConvert.DeserializeObject>(tokenstr); + string token = dic["securityToken"]; + return token; + } + return ""; + } + + + /// + /// 获取千里马的数据 + /// + /// + public async Task GetHotelData() + { + try + { + ConfigData data = null; + object OOO = Application["config"]; + if (OOO != null) + { + data = OOO as ConfigData; + } + + if (data == null) + { + return; + } + foreach (var HHH in data.DuiJieInfos) + { + string code = HHH.hotel_code; + RData r = new RData(); + + QHotelData h = new QHotelData(); + h.hostName = "Stephen-PC"; + h.lang = "zh-CN"; + h.optCode = UserCode; + h.userCode = UserCode; + + h.orgUnitNo = qianlima_orgUnitNo; + h.productCode = "zh-CN"; + //object ooo = Application[QianLiMa_LoginToken]; + + string ooo = ""; + GlobalData.TryGetValue(QianLiMa_LoginToken, out ooo); + if (string.IsNullOrEmpty(ooo)) + { + return; + } + h.securityToken = ooo; + + ParamsData paramsData = new ParamsData(); + //paramsData.gstStat = "默认查在住状态"; + + r.@params = paramsData; + r.integratedRequest = h; + + + var tokenstr = await Send_Http_Request_Json("iPMSAPI/iPMSApiService/api/queryInHouseList", r); + _logger.Error("获取到千里马酒店的数据为:" + tokenstr); + if (!string.IsNullOrEmpty(tokenstr)) + { + var dic = JsonConvert.DeserializeObject(tokenstr); + var ll = dic.resultList; + + var T = new List>(); + foreach (CustomerData item in ll) + { + var tu = new Tuple( + item.accid, + item.docno, + item.doctype, + item.gstTel, + item.gstname, + item.rmno + ); + T.Add(tu); + } + var U = CSRedisCacheHelper.Get>>(QianLiMa_DingDan); + if (U == null) + { + CSRedisCacheHelper.Set(QianLiMa_DingDan, T); + } + else + { + var Take_T = U as List>; + + //开房的 + var NewAdd = T.Except(Take_T); + + string errormsg = ""; + if (NewAdd.Count() > 0) + { + foreach (var item in NewAdd) + { + //item.accid, + //item.docno, + //item.doctype, + //item.gstTel, + //item.gstname, + //item.rmno + string ti = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); + string tj = DateTime.Now.AddDays(1).ToString("yyyy-MM-dd HH:mm:ss"); + + string Item2 = item.Item2; + if (string.IsNullOrEmpty(item.Item2)) + { + Item2 = ""; + } + + string Item5 = item.Item5; + if (string.IsNullOrEmpty(item.Item5)) + { + Item5 = ""; + } + string xmldata = XmlGenerate(item.Item1, Item2, Item5, ti, tj); + + _logger.Error("检测到开房:" + item.Item1 + " RoomNo:" + item.Item6); + b.CheckIn(_key, code, item.Item6, DateTime.Now, xmldata, ref errormsg, "", Item2); + _logger.Error("检测到开房:errormsg: " + errormsg); + } + } + + //退房的 + var CheckOut = Take_T.Except(T); + if (CheckOut.Count() > 0) + { + foreach (var item in CheckOut) + { + _logger.Error("检测到退房,RoomNo:" + item.Item6); + b.CheckOut(_key, code, item.Item6, DateTime.Now, ref errormsg); + _logger.Error("检测到退房,error:" + errormsg); + } + } + + CSRedisCacheHelper.Set(QianLiMa_DingDan, T); + } + + } + } + } + catch (Exception ex) + { + _logger.Error("GetHotelData: " + ex.Message); + _logger.Error("GetHotelData: " + ex.StackTrace); + } + } + + /// + /// 发送json数据 + /// + /// + /// + /// + public static async Task Send_Http_Request_Json(string Url, object json) + { + var client1 = new RestClient(BaseUrl); + //var client1 = new RestClient("http://localhost:5132"); + var request1 = new RestRequest(Url, Method.POST); + + request1.AddJsonBody(json); + + var response = client1.Execute(request1); + var content = response.Content; + return content; + } + + /// + /// 发送url编码数据 + /// + /// + /// + /// + public static async Task Send_Http_Request_Params(string Url, Dictionary Params) + { + var client1 = new RestClient(BaseUrl); + var request1 = new RestRequest(Url, Method.POST); + + foreach (KeyValuePair item in Params) + { + request1.AddParameter(item.Key, item.Value); + } + + var response = client1.Execute(request1); + var content = response.Content; + return content; + } + + private ServiceReference1.blwwsSoapClient b = new ServiceReference1.blwwsSoapClient(); + private async void Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) + { + try + { + timer.Stop(); + await GetHotelData(); + timer.Start(); + } + catch (Exception ex) + { + _logger.Error("GetHotelData: " + ex.Message); + } + } + + // + // //入住日期 + // checkoutdate="2015-07-02 13:45:20" /> //离店日期 + // + public string XmlGenerate(decimal orderno, string idcardno, string customername, string checkintdatetime, string checkoutdatetime) + { + XElement xelement = new XElement("interface", + new XAttribute[] + { + new XAttribute("orderno",orderno), + new XAttribute("cost","100"), + new XAttribute("roomtype",""), + new XAttribute("breakfast",""), + new XAttribute("occupancy",""), + new XAttribute("deposit","") + }, + new XElement("item", + new XAttribute[] + { + new XAttribute("idtype", "0"), + new XAttribute("idcard", idcardno), + new XAttribute("customer", customername), + new XAttribute("sex", "1"), + new XAttribute("country", "1"), + new XAttribute("checkindate", checkintdatetime), + new XAttribute("checkoutdate",checkoutdatetime) + }) + ); + string hhh = xelement.ToString(); + return hhh; + } + + } +} \ No newline at end of file diff --git a/MyQianLiMa/Index.aspx b/MyQianLiMa/Index.aspx new file mode 100644 index 0000000..4557596 --- /dev/null +++ b/MyQianLiMa/Index.aspx @@ -0,0 +1,17 @@ +<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Index.aspx.cs" Inherits="MyQianLiMa.Index" %> + + + + + + + + + +
+
+ hello +
+
+ + diff --git a/MyQianLiMa/Index.aspx.cs b/MyQianLiMa/Index.aspx.cs new file mode 100644 index 0000000..e96d481 --- /dev/null +++ b/MyQianLiMa/Index.aspx.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; +using System.Web.UI; +using System.Web.UI.WebControls; + +namespace MyQianLiMa +{ + public partial class Index : System.Web.UI.Page + { + protected void Page_Load(object sender, EventArgs e) + { + + } + } +} \ No newline at end of file diff --git a/MyQianLiMa/Index.aspx.designer.cs b/MyQianLiMa/Index.aspx.designer.cs new file mode 100644 index 0000000..37c814e --- /dev/null +++ b/MyQianLiMa/Index.aspx.designer.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// <自动生成> +// 此代码由工具生成。 +// +// 对此文件的更改可能导致不正确的行为,如果 +// 重新生成代码,则所做更改将丢失。 +// +//------------------------------------------------------------------------------ + +namespace MyQianLiMa +{ + + + public partial class Index + { + + /// + /// form1 控件。 + /// + /// + /// 自动生成的字段。 + /// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。 + /// + protected global::System.Web.UI.HtmlControls.HtmlForm form1; + } +} diff --git a/MyQianLiMa/Job/GetTokenJob.cs b/MyQianLiMa/Job/GetTokenJob.cs new file mode 100644 index 0000000..45f844f --- /dev/null +++ b/MyQianLiMa/Job/GetTokenJob.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.Http; +using System.Threading.Tasks; +using System.Web; +using MyQianLiMa; +using Quartz; + +namespace MoNi_QianLiMa.Job +{ + public class GetTokenJob : IJob + { + public async Task Execute(IJobExecutionContext context) + { + string token = await MyQianLiMa.Global.GetToken_G(); + + Global.GlobalData.AddOrUpdate(Global.QianLiMa_LoginToken,token,(k,v)=> + { + return token; + }); + } + } +} \ No newline at end of file diff --git a/MyQianLiMa/MyQianLiMa.csproj b/MyQianLiMa/MyQianLiMa.csproj new file mode 100644 index 0000000..9723ba8 --- /dev/null +++ b/MyQianLiMa/MyQianLiMa.csproj @@ -0,0 +1,242 @@ + + + + + Debug + AnyCPU + + + 2.0 + {D7F82DA5-DC79-4308-BA3E-304287123032} + {349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc} + Library + Properties + MyQianLiMa + MyQianLiMa + v4.6.2 + true + + + + + + + + + + + true + full + false + bin\ + DEBUG;TRACE + prompt + 4 + + + true + pdbonly + true + bin\ + TRACE + prompt + 4 + + + + ..\packages\CSRedisCore.3.8.804\lib\net45\CSRedisCore.dll + + + + ..\packages\Microsoft.Extensions.Logging.Abstractions.2.1.1\lib\netstandard2.0\Microsoft.Extensions.Logging.Abstractions.dll + + + ..\packages\NLog.6.0.0\lib\net46\NLog.dll + + + ..\packages\Quartz.3.14.0\lib\net462\Quartz.dll + + + ..\BLWWS\RestSharp\RestSharp.dll + + + + + + + ..\packages\System.ValueTuple.4.5.0\lib\net461\System.ValueTuple.dll + + + + + + + + + + + + + + + + + + + + + ..\packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll + + + ..\packages\Microsoft.AspNet.WebApi.Client.5.2.9\lib\net45\System.Net.Http.Formatting.dll + + + ..\packages\Microsoft.AspNet.WebApi.Core.5.2.9\lib\net45\System.Web.Http.dll + + + ..\packages\Microsoft.AspNet.WebApi.WebHost.5.2.9\lib\net45\System.Web.Http.WebHost.dll + + + ..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.2.0.1\lib\net45\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.dll + + + + + PreserveNewest + + + + + + + + Reference.svcmap + + + Reference.svcmap + + + Reference.svcmap + + + Reference.svcmap + + + Reference.svcmap + + + Reference.svcmap + + + Reference.svcmap + + + Reference.svcmap + + + Reference.svcmap + + + WCF Proxy Generator + Reference.cs + + + + + + + + + + + True + True + Reference.svcmap + + + + Global.asax + + + Index.aspx + ASPXCodeBehind + + + Index.aspx + + + + + + + + WebForm1.aspx + ASPXCodeBehind + + + WebForm1.aspx + + + + + Designer + + + + Web.config + + + Web.config + + + + + + + + + + + + + + 10.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + + + + + + True + True + 15081 + / + http://localhost:15081/ + False + False + + + False + + + + + + + 这台计算机上缺少此项目引用的 NuGet 程序包。使用“NuGet 程序包还原”可下载这些程序包。有关更多信息,请参见 http://go.microsoft.com/fwlink/?LinkID=322105。缺少的文件是 {0}。 + + + + + + + \ No newline at end of file diff --git a/MyQianLiMa/NLog.xsd b/MyQianLiMa/NLog.xsd new file mode 100644 index 0000000..44b1d25 --- /dev/null +++ b/MyQianLiMa/NLog.xsd @@ -0,0 +1,5039 @@ + + + + + + + + + + + + + + + + Watch config file for changes and reload automatically. + + + + + Print internal NLog messages to the console. Default value is: false + + + + + Print internal NLog messages to the console error output. Default value is: false + + + + + Write internal NLog messages to the specified file. + + + + + Log level threshold for internal log messages. Default value is: Info. + + + + + Global log level threshold for application log messages. Messages below this level won't be logged. + + + + + Throw an exception when there is an internal error. Default value is: false. Not recommend to set to true in production! + + + + + Throw an exception when there is a configuration error. If not set, determined by throwExceptions. + + + + + Gets or sets a value indicating whether Variables should be kept on configuration reload. Default value is: false. + + + + + Write internal NLog messages to the System.Diagnostics.Trace. Default value is: false. + + + + + Write timestamps for internal NLog messages. Default value is: true. + + + + + Use InvariantCulture as default culture instead of CurrentCulture. Default value is: false. + + + + + Perform message template parsing and formatting of LogEvent messages (true = Always, false = Never, empty = Auto Detect). Default value is: empty. + + + + + + + + + + + + + + Make all targets within this section asynchronous (creates additional threads but the calling thread isn't blocked by any target writes). + + + + + + + + + + + + + + + + + Prefix for targets/layout renderers/filters/conditions loaded from this assembly. + + + + + Load NLog extensions from the specified file (*.dll) + + + + + Load NLog extensions from the specified assembly. Assembly name should be fully qualified. + + + + + + + + + + Filter on the name of the logger. May include wildcard characters ('*' or '?'). + + + + + Comma separated list of levels that this rule matches. + + + + + Minimum level that this rule matches. + + + + + Maximum level that this rule matches. + + + + + Level that this rule matches. + + + + + Comma separated list of target names. + + + + + Ignore further rules if this one matches. + + + + + Enable this rule. Note: disabled rules aren't available from the API. + + + + + Rule identifier to allow rule lookup with Configuration.FindRuleByName and Configuration.RemoveRuleByName. + + + + + Loggers matching will be restricted to specified minimum level for following rules. + + + + + + + + + + + + + + + Default action if none of the filters match. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the file to be included. You could use * wildcard. The name is relative to the name of the current config file. + + + + + Ignore any errors in the include file. + + + + + + + + Variable value. Note, the 'value' attribute has precedence over this one. + + + + + Layout type variable value. Note, the 'value' attribute has precedence over this one. + + + + + + Variable name. + + + + + Variable value. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Maximum number of log events that the buffer can keep. + + + + + Number of log events to be buffered. + + + + + Indicates whether buffer should grow as needed. + + + + + + + + + + + + + + + Name of the target. + + + + + Layout used to format log messages. + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Action to be taken when the lazy writer thread request queue count exceeds the set limit. + + + + + Limit on the number of requests in the lazy writer thread request queue. + + + + + Number of log events that should be processed in a batch by the lazy writer thread. + + + + + Whether to use the locking queue, instead of a lock-free concurrent queue + + + + + Number of batches of P:NLog.Targets.Wrappers.AsyncTargetWrapper.BatchSize to write before yielding into P:NLog.Targets.Wrappers.AsyncTargetWrapper.TimeToSleepBetweenBatches + + + + + Time in milliseconds to sleep between batches. (1 or less means trigger on new activity) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Name of the file to write to. + + + + + Text to be rendered. + + + + + Header. + + + + + Footer. + + + + + Whether to write the Header on initial creation of file appender, even if the file is not empty. Default value is false, which means only write header when initial file is empty (Ex. ensures valid CSV files) + + + + + Indicates whether the footer should be written only when the file is archived. + + + + + Maximum number of archive files that should be kept. + + + + + Format-string to convert archive sequence-number by using string.Format + + + + + Maximum days of archive files that should be kept. + + + + + Legacy archive logic where file-archive-logic moves active file to path specified by P:NLog.Targets.FileTarget.ArchiveFileName, and then recreates the active file. Use P:NLog.Targets.FileTarget.ArchiveSuffixFormat to control suffix format, instead of now obsolete token {#} + + + + + Indicates whether to trigger archive operation based on time-period, by moving active-file to file-path specified by P:NLog.Targets.FileTarget.ArchiveFileName + + + + + Size in bytes above which log files will be automatically archived. + + + + + Indicates whether to archive old log file on startup. + + + + + Indicates whether concurrent writes to the log file by multiple processes on the same host. + + + + + File encoding. + + + + + Whether or not this target should just discard all data that its asked to write. Mostly used for when testing NLog Stack except final write + + + + + Indicates whether to write BOM (byte order mark) in created files. Defaults to true for UTF-16 and UTF-32 + + + + + Indicates whether to enable log file(s) to be deleted. + + + + + Indicates whether to delete old log file on startup. + + + + + Indicates whether to create directories if they do not exist. + + + + + Indicates whether to replace file contents on each write instead of appending log message at the end. + + + + + Line ending mode. + + + + + Maximum number of seconds that files are kept open. Zero or negative means disabled. + + + + + Log file buffer size in bytes. + + + + + Indicates whether to automatically flush the file buffers after each log message. + + + + + Number of files to be kept open. Setting this to a higher value may improve performance in a situation where a single File target is writing to many files (such as splitting by level or by logger). + + + + + Maximum number of seconds before open files are flushed. Zero or negative means disabled. + + + + + Indicates whether to keep log file open instead of opening and closing it on each logging event. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Delay the flush until the LogEvent has been confirmed as written + + + + + Condition expression. Log events who meet this condition will cause a flush on the wrapped target. + + + + + Only flush when LogEvent matches condition. Ignore explicit-flush, config-reload-flush and shutdown-flush + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Number of log events to be buffered. + + + + + Action to take if the buffer overflows. + + + + + Timeout (in milliseconds) after which the contents of buffer will be flushed if there's no write in the specified period of time. Use -1 to disable timed flushes. + + + + + Indicates whether to use sliding timeout. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Text to be rendered. + + + + + Header. + + + + + Footer. + + + + + Indicates whether to auto-check if the console is available. - Disables console writing if Environment.UserInteractive = False (Windows Service) - Disables console writing if Console Standard Input is not available (Non-Console-App) + + + + + Enables output using ANSI Color Codes + + + + + The encoding for writing messages to the T:System.Console. + + + + + Support NO_COLOR=1 environment variable. See also https://no-color.org/ + + + + + Indicates whether to send the log messages to the standard error instead of the standard output. + + + + + Indicates whether to auto-flush after M:System.Console.WriteLine + + + + + Indicates whether to auto-check if the console has been redirected to file - Disables coloring logic when System.Console.IsOutputRedirected = true + + + + + Indicates whether to use default row highlighting rules. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Background color. + + + + + Condition that must be met in order to set the specified foreground and background color. + + + + + Foreground color. + + + + + + + + + + + + + + + Background color. + + + + + Condition that must be met before scanning the row for highlight of words + + + + + Foreground color. + + + + + Indicates whether to ignore case when comparing texts. + + + + + Text to be matched. You must specify either text or regex. + + + + + Indicates whether to match whole words only. + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Text to be rendered. + + + + + Header. + + + + + Footer. + + + + + Indicates whether to auto-flush after M:System.Console.WriteLine + + + + + Indicates whether to auto-check if the console is available - Disables console writing if Environment.UserInteractive = False (Windows Service) - Disables console writing if Console Standard Input is not available (Non-Console-App) + + + + + The encoding for writing messages to the T:System.Console. + + + + + Whether to force M:System.Console.WriteLine (slower) instead of the faster internal buffering. + + + + + Indicates whether to send the log messages to the standard error instead of the standard output. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Database user name. If the ConnectionString is not provided this value will be used to construct the "User ID=" part of the connection string. + + + + + Database password. If the ConnectionString is not provided this value will be used to construct the "Password=" part of the connection string. + + + + + Database name. If the ConnectionString is not provided this value will be used to construct the "Database=" part of the connection string. + + + + + Name of the connection string (as specified in <connectionStrings> configuration section. + + + + + Database host name. If the ConnectionString is not provided this value will be used to construct the "Server=" part of the connection string. + + + + + Indicates whether to keep the database connection open between the log events. + + + + + Name of the database provider. + + + + + Connection string. When provided, it overrides the values specified in DBHost, DBUserName, DBPassword, DBDatabase. + + + + + Connection string using for installation and uninstallation. If not provided, regular ConnectionString is being used. + + + + + Configures isolated transaction batch writing. If supported by the database, then it will improve insert performance. + + + + + Text of the SQL command to be run on each log level. + + + + + Type of the SQL command to be run on each log level. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Convert format of the property value + + + + + Culture used for parsing property string-value for type-conversion + + + + + Value to assign on the object-property + + + + + Name for the object-property + + + + + Type of the object-property + + + + + + + + + + + + + + Type of the command. + + + + + Connection string to run the command against. If not provided, connection string from the target is used. + + + + + Indicates whether to ignore failures. + + + + + Command text. + + + + + + + + + + + + + + + + + + + + Database parameter name. + + + + + Layout used for rendering the database-parameter value. + + + + + Database parameter DbType. + + + + + Database parameter size. + + + + + Database parameter precision. + + + + + Database parameter scale. + + + + + Type of the parameter. + + + + + Fallback value when result value is not available + + + + + Convert format of the database parameter value. + + + + + Culture used for parsing parameter string-value for type-conversion + + + + + Whether empty value should translate into DbNull. Requires database column to allow NULL values. + + + + + + + + + + + + + + + Name of the target. + + + + + Text to be rendered. + + + + + Header. + + + + + Footer. + + + + + + + + + + + + + + + + + Name of the target. + + + + + Text to be rendered. + + + + + Header. + + + + + Footer. + + + + + + + + + + + + + + + Name of the target. + + + + + Layout used to format log messages. + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + + Indicates whether to include call site (class and method name) in the T:NLog.LogEventInfo + + + + + Indicates whether to include source info (file name and line number) in the T:NLog.LogEventInfo + + + + + Option to include all properties from the log events + + + + + Indicates whether to include contents of the T:NLog.GlobalDiagnosticsContext dictionary + + + + + Whether to include the contents of the T:NLog.ScopeContext nested-state-stack. + + + + + Whether to include the contents of the T:NLog.ScopeContext properties-dictionary. + + + + + List of property names to exclude when P:NLog.Targets.TargetWithContext.IncludeEventProperties is true + + + + + Event Name for M:System.Diagnostics.DiagnosticSource.Write(System.String,System.Object) + + + + + Value for Event Payload Level-Property + + + + + Source Name for T:System.Diagnostics.DiagnosticSource + + + + + + + + + + + + + + + + Name of the property. + + + + + Layout used for rendering the property value. + + + + + Fallback value when result value is not available + + + + + Whether empty property value should be included in the output. Default = false + + + + + Type of the property. + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Layout used to format log messages. + + + + + Layout that renders event Category. + + + + + Optional entry type. When not set, or when not convertible to T:System.Diagnostics.EventLogEntryType then determined by T:NLog.LogLevel + + + + + Layout that renders event ID. + + + + + Name of the Event Log to write to. This can be System, Application or any user-defined name. + + + + + Name of the machine on which Event Log service is running. + + + + + Maximum Event log size in kilobytes. + + + + + Message length limit to write to the Event Log. + + + + + Value to be used as the event Source. + + + + + Action to take if the message is larger than the P:NLog.Targets.EventLogTarget.MaxMessageLength option. + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Indicates whether to return to the first target after any successful write. + + + + + Whether to enable batching, but fallback will be handled individually + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Name of the file to write to. + + + + + Text to be rendered. + + + + + Header. + + + + + Footer. + + + + + Indicates whether the footer should be written only when the file is archived. + + + + + Maximum number of archive files that should be kept. + + + + + Maximum days of archive files that should be kept. + + + + + Format-string to convert archive sequence-number by using string.Format + + + + + Whether to write the Header on initial creation of file appender, even if the file is not empty. Default value is false, which means only write header when initial file is empty (Ex. ensures valid CSV files) + + + + + Legacy archive logic where file-archive-logic moves active file to path specified by P:NLog.Targets.FileTarget.ArchiveFileName, and then recreates the active file. Use P:NLog.Targets.FileTarget.ArchiveSuffixFormat to control suffix format, instead of now obsolete token {#} + + + + + Indicates whether to trigger archive operation based on time-period, by moving active-file to file-path specified by P:NLog.Targets.FileTarget.ArchiveFileName + + + + + Size in bytes above which log files will be automatically archived. + + + + + Indicates whether to archive old log file on startup. + + + + + Whether or not this target should just discard all data that its asked to write. Mostly used for when testing NLog Stack except final write + + + + + Indicates whether to write BOM (byte order mark) in created files. Defaults to true for UTF-16 and UTF-32 + + + + + Indicates whether to enable log file(s) to be deleted. + + + + + Indicates whether to delete old log file on startup. + + + + + Indicates whether to create directories if they do not exist. + + + + + File encoding. + + + + + Indicates whether to replace file contents on each write instead of appending log message at the end. + + + + + Line ending mode. + + + + + Log file buffer size in bytes. + + + + + Indicates whether to automatically flush the file buffers after each log message. + + + + + Number of files to be kept open. Setting this to a higher value may improve performance in a situation where a single File target is writing to many files (such as splitting by level or by logger). + + + + + Indicates whether to keep log file open instead of opening and closing it on each logging event. + + + + + Maximum number of seconds before open files are flushed. Zero or negative means disabled. + + + + + Maximum number of seconds that files are kept open. Zero or negative means disabled. + + + + + + + + + + + + + + + + Name of the target. + + + + + Condition expression. Log events who meet this condition will be forwarded to the wrapped target. + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Layout used to format log messages. + + + + + Indicates whether log text should be appended to the text of the control instead of overwriting it. + + + + + Name of control to which NLog will log write log text. + + + + + Name of the Form on which the control is located. + + + + + Whether new log entry are added to the start or the end of the control + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Password for the custom SSL certificate specified by P:NLog.Targets.NetworkTarget.SslCertificateFile + + + + + File path to custom SSL certificate for TCP Socket SSL connections + + + + + SSL/TLS protocols. Default no SSL/TLS is used. Currently only implemented for TCP. + + + + + The number of seconds a TCP socket send-operation will block before timeout error. Default = 100 secs (0 = wait forever when network cable unplugged and tcp-buffer becomes full). + + + + + Action that should be taken if the message is larger than P:NLog.Targets.NetworkTarget.MaxMessageSize + + + + + Action that should be taken, when more connections than P:NLog.Targets.NetworkTarget.MaxConnections. + + + + + Action that should be taken, when more pending messages than P:NLog.Targets.NetworkTarget.MaxQueueSize. + + + + + Maximum simultaneous connections. Requires P:NLog.Targets.NetworkTarget.KeepConnection = false + + + + + Indicates whether to keep connection open whenever possible. + + + + + The number of seconds a connection will remain idle before the first keep-alive probe is sent + + + + + Size of the connection cache (number of connections which are kept alive). Requires P:NLog.Targets.NetworkTarget.KeepConnection = true + + + + + Network destination address. + + + + + Maximum queue size for a single connection. Requires P:NLog.Targets.NetworkTarget.KeepConnection = true + + + + + + Whether to disable the delayed ACK timer, and avoid delay of 200 ms. Default = true. + + + + + + + + + Type of compression for protocol payload. Useful for UDP where datagram max-size is 8192 bytes. + + + + + + + Skip compression when protocol payload is below limit to reduce overhead in cpu-usage and additional headers + + + + + + Maximum message size in bytes. On limit breach then P:NLog.Targets.NetworkTarget.OnOverflow action is activated. + + + + + Encoding to be used. + + + + + End of line value if a newline is appended at the end of log message P:NLog.Targets.NetworkTarget.NewLine. + + + + + Indicates whether to append newline at the end of log message. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Identifier to perform group-by + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Name of the file to write to. + + + + + Text to be rendered. + + + + + Header. + + + + + Footer. + + + + + Whether to write the Header on initial creation of file appender, even if the file is not empty. Default value is false, which means only write header when initial file is empty (Ex. ensures valid CSV files) + + + + + Indicates whether the footer should be written only when the file is archived. + + + + + Maximum number of archive files that should be kept. + + + + + Format-string to convert archive sequence-number by using string.Format + + + + + Maximum days of archive files that should be kept. + + + + + Legacy archive logic where file-archive-logic moves active file to path specified by P:NLog.Targets.FileTarget.ArchiveFileName, and then recreates the active file. Use P:NLog.Targets.FileTarget.ArchiveSuffixFormat to control suffix format, instead of now obsolete token {#} + + + + + Indicates whether to trigger archive operation based on time-period, by moving active-file to file-path specified by P:NLog.Targets.FileTarget.ArchiveFileName + + + + + Size in bytes above which log files will be automatically archived. + + + + + Indicates whether to archive old log file on startup. + + + + + Whether to emphasize Fastest-speed or Optimal-compression + + + + + Whether to enable file-compression using T:System.IO.Compression.GZipStream + + + + + Whether or not this target should just discard all data that its asked to write. Mostly used for when testing NLog Stack except final write + + + + + Indicates whether to write BOM (byte order mark) in created files. Defaults to true for UTF-16 and UTF-32 + + + + + Indicates whether to enable log file(s) to be deleted. + + + + + Indicates whether to delete old log file on startup. + + + + + Indicates whether to create directories if they do not exist. + + + + + File encoding. + + + + + Indicates whether to replace file contents on each write instead of appending log message at the end. + + + + + Line ending mode. + + + + + Maximum number of seconds that files are kept open. Zero or negative means disabled. + + + + + Log file buffer size in bytes. + + + + + Indicates whether to automatically flush the file buffers after each log message. + + + + + Number of files to be kept open. Setting this to a higher value may improve performance in a situation where a single File target is writing to many files (such as splitting by level or by logger). + + + + + Maximum number of seconds before open files are flushed. Zero or negative means disabled. + + + + + Indicates whether to keep log file open instead of opening and closing it on each logging event. + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Windows domain name to change context to. + + + + + Required impersonation level. + + + + + Type of the logon provider. + + + + + Logon Type. + + + + + User account password. + + + + + Indicates whether to revert to the credentials of the process instead of impersonating another user. + + + + + Username to change context to. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Interval in which messages will be written up to the P:NLog.Targets.Wrappers.LimitingTargetWrapper.MessageLimit number of messages. + + + + + Maximum allowed number of messages written per P:NLog.Targets.Wrappers.LimitingTargetWrapper.Interval. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Separator for T:NLog.ScopeContext operation-states-stack. + + + + + Stack separator for log4j:NDC in output from T:NLog.ScopeContext nested context. + + + + + Log4j:event logger-xml-attribute. Default: ${logger} + + + + + Whether to include the contents of the T:NLog.ScopeContext properties-dictionary. + + + + + Whether to include log4j:NDC in output from T:NLog.ScopeContext nested context. + + + + + Indicates whether to include source info (file name and line number) in the information sent over the network. + + + + + Option to include all properties from the log events + + + + + Indicates whether to include call site (class and method name) in the information sent over the network. + + + + + Log4j:event message-xml-element. Default: ${message} + + + + + Log4j:event log4japp-xml-element. By default it's the friendly name of the current AppDomain. + + + + + Instance of T:NLog.Layouts.Log4JXmlEventLayout that is used to format log messages. + + + + + Whether to include log4j:NDC in output from T:NLog.ScopeContext nested context. + + + + + Action that should be taken, when more pending messages than P:NLog.Targets.NetworkTarget.MaxQueueSize. + + + + + Password for the custom SSL certificate specified by P:NLog.Targets.NetworkTarget.SslCertificateFile + + + + + File path to custom SSL certificate for TCP Socket SSL connections + + + + + SSL/TLS protocols. Default no SSL/TLS is used. Currently only implemented for TCP. + + + + + The number of seconds a TCP socket send-operation will block before timeout error. Default = 100 secs (0 = wait forever when network cable unplugged and tcp-buffer becomes full). + + + + + Action that should be taken if the message is larger than P:NLog.Targets.NetworkTarget.MaxMessageSize + + + + + The number of seconds a connection will remain idle before the first keep-alive probe is sent + + + + + Maximum queue size for a single connection. Requires P:NLog.Targets.NetworkTarget.KeepConnection = true + + + + + Maximum simultaneous connections. Requires P:NLog.Targets.NetworkTarget.KeepConnection = false + + + + + Indicates whether to keep connection open whenever possible. + + + + + Size of the connection cache (number of connections which are kept alive). Requires P:NLog.Targets.NetworkTarget.KeepConnection = true + + + + + Network destination address. + + + + + Action that should be taken, when more connections than P:NLog.Targets.NetworkTarget.MaxConnections. + + + + + Type of compression for protocol payload. Useful for UDP where datagram max-size is 8192 bytes. + + + + + Skip compression when protocol payload is below limit to reduce overhead in cpu-usage and additional headers + + + + + Whether to disable the delayed ACK timer, and avoid delay of 200 ms. Default = true. + + + + + Maximum message size in bytes. On limit breach then P:NLog.Targets.NetworkTarget.OnOverflow action is activated. + + + + + Encoding to be used. + + + + + End of line value if a newline is appended at the end of log message P:NLog.Targets.NetworkTarget.NewLine. + + + + + Indicates whether to append newline at the end of log message. + + + + + + + + + + + + + + Log4j:data property-name. + + + + + Layout used for rendering the log4j:data property-value. + + + + + Whether empty property-value should be included in the output. Default = false + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Endpoint address. + + + + + Name of the endpoint configuration in WCF configuration file. + + + + + Indicates whether to use a WCF service contract that is one way (fire and forget) or two way (request-reply) + + + + + Client ID. + + + + + Indicates whether to include per-event properties in the payload sent to the server. + + + + + Indicates whether to use binary message encoding. + + + + + + + + + + + + + + + Name of the parameter. + + + + + Layout used for rendering the method-parameter value. + + + + + Fallback value when result value is not available + + + + + Type of the parameter. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Text to be rendered. + + + + + Header. + + + + + Footer. + + + + + Indicates whether NewLine characters in the body should be replaced with tags. + + + + + Indicates whether to add new lines between log entries. + + + + + Encoding to be used for sending e-mail. + + + + + BCC email addresses separated by semicolons (e.g. john@domain.com;jane@domain.com). + + + + + Priority used for sending mails. + + + + + Recipients' email addresses separated by semicolons (e.g. john@domain.com;jane@domain.com). + + + + + Indicates whether to send message as HTML instead of plain text. + + + + + Sender's email address (e.g. joe@domain.com). + + + + + Mail message body (repeated for each log message send in one mail). + + + + + Mail subject. + + + + + CC email addresses separated by semicolons (e.g. john@domain.com;jane@domain.com). + + + + + Provides a way of specifying the SSL and/or TLS encryption If P:NLog.MailKit.MailTarget.EnableSsl is true, then F:MailKit.Security.SecureSocketOptions.SslOnConnect will be used. + + + + + Get or set whether the client should use the REQUIRETLS extension if it is available. + + + + + Indicates the SMTP client timeout. + + + + + Folder where applications save mail messages to be processed by the local SMTP server. + + + + + Indicates whether SmtpClient should ignore invalid certificate. + + + + + Indicates whether SSL (secure sockets layer) should be used when communicating with SMTP server. + + + + + Password used to authenticate against SMTP server (used when SmtpAuthentication is set to "basic"). + + + + + Username used to connect to SMTP server (used when SmtpAuthentication is set to "basic"). + + + + + SMTP Authentication mode. + + + + + SMTP Server to be used for sending. + + + + + Indicates whether the default Settings from System.Net.MailSettings should be used. + + + + + Port number that SMTP Server is listening on. + + + + + Specifies how outgoing email messages will be handled. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Text to be rendered. + + + + + Header. + + + + + Footer. + + + + + Max number of items to have in memory + + + + + + + + + + + + + + + + Name of the target. + + + + + Layout used to format log messages. + + + + + Message box title. + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Layout used to format log messages. + + + + + Encoding to be used when writing text to the queue. + + + + + Indicates whether to use the XML format when serializing message. + + + + + Indicates whether to check if a queue exists before writing to it. + + + + + Indicates whether to create the queue if it doesn't exists. + + + + + Label to associate with each message. + + + + + Name of the queue to write to. + + + + + Indicates whether to use recoverable messages (with guaranteed delivery). + + + + + Indicates whether sending to a transactional queue using single-transaction-style. + + + + + + + + + + + + + + + + + Name of the target. + + + + + Class name. + + + + + Method name. The method must be public and static. Use the AssemblyQualifiedName , https://msdn.microsoft.com/en-us/library/system.type.assemblyqualifiedname(v=vs.110).aspx e.g. + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + + Indicates whether to include call site (class and method name) in the T:NLog.LogEventInfo + + + + + Indicates whether to include source info (file name and line number) in the T:NLog.LogEventInfo + + + + + Option to include all properties from the log events + + + + + Indicates whether to include contents of the T:NLog.GlobalDiagnosticsContext dictionary + + + + + Whether to include the contents of the T:NLog.ScopeContext nested-state-stack. + + + + + Whether to include the contents of the T:NLog.ScopeContext properties-dictionary. + + + + + List of property names to exclude when P:NLog.Targets.TargetWithContext.IncludeEventProperties is true + + + + + EventId forwarded to ILogger + + + + + EventId-Name forwarded to ILogger + + + + + Override name of ILogger, when target has been initialized with T:Microsoft.Extensions.Logging.ILoggerFactory + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Layout used to format log messages. + + + + + Password for the custom SSL certificate specified by P:NLog.Targets.NetworkTarget.SslCertificateFile + + + + + File path to custom SSL certificate for TCP Socket SSL connections + + + + + SSL/TLS protocols. Default no SSL/TLS is used. Currently only implemented for TCP. + + + + + The number of seconds a TCP socket send-operation will block before timeout error. Default = 100 secs (0 = wait forever when network cable unplugged and tcp-buffer becomes full). + + + + + Action that should be taken if the message is larger than P:NLog.Targets.NetworkTarget.MaxMessageSize + + + + + Action that should be taken, when more connections than P:NLog.Targets.NetworkTarget.MaxConnections. + + + + + Action that should be taken, when more pending messages than P:NLog.Targets.NetworkTarget.MaxQueueSize. + + + + + Maximum simultaneous connections. Requires P:NLog.Targets.NetworkTarget.KeepConnection = false + + + + + Indicates whether to keep connection open whenever possible. + + + + + The number of seconds a connection will remain idle before the first keep-alive probe is sent + + + + + Size of the connection cache (number of connections which are kept alive). Requires P:NLog.Targets.NetworkTarget.KeepConnection = true + + + + + Network destination address. + + + + + Maximum queue size for a single connection. Requires P:NLog.Targets.NetworkTarget.KeepConnection = true + + + + + Type of compression for protocol payload. Useful for UDP where datagram max-size is 8192 bytes. + + + + + Skip compression when protocol payload is below limit to reduce overhead in cpu-usage and additional headers + + + + + Whether to disable the delayed ACK timer, and avoid delay of 200 ms. Default = true. + + + + + Maximum message size in bytes. On limit breach then P:NLog.Targets.NetworkTarget.OnOverflow action is activated. + + + + + Encoding to be used. + + + + + End of line value if a newline is appended at the end of log message P:NLog.Targets.NetworkTarget.NewLine. + + + + + Indicates whether to append newline at the end of log message. + + + + + + + + + + + + + + + + Name of the target. + + + + + Layout used to format log messages. + + + + + Indicates whether to perform layout calculation. + + + + + + + + + + + + + + + + + Name of the target. + + + + + Text to be rendered. + + + + + Header. + + + + + Footer. + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Indicates whether performance counter should be automatically created. + + + + + Name of the performance counter category. + + + + + Counter help text. + + + + + Name of the performance counter. + + + + + Performance counter type. + + + + + The value by which to increment the counter. + + + + + Performance counter instance name. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Default filter to be applied when no specific rule matches. + + + + + + + + + + + + + Condition to be tested. + + + + + Resulting filter to be applied when the condition matches. + + + + + + + + + + + + Name of the target. + + + + + + + + + + + + + + + Name of the target. + + + + + Number of times to repeat each log message. + + + + + + + + + + + + + + + + + Name of the target. + + + + + Whether to enable batching, and only apply single delay when a whole batch fails + + + + + Number of retries that should be attempted on the wrapped target in case of a failure. + + + + + Time to wait between retries in milliseconds. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Layout used to format log messages. + + + + + Initial width of the form with rich text box. + + + + + Indicates whether the created window will be a tool window. + + + + + Indicates whether the created form will be initially minimized. + + + + + Maximum number of lines the rich text box will store (or 0 to disable this feature). + + + + + gets or sets the message retention strategy which determines how the target handles messages when there's no control attached, or when switching between controls + + + + + Name of the Form on which the control is located. If there is no open form of a specified name than NLog will create a new one. + + + + + Name of RichTextBox to which Nlog will write. + + + + + Indicates whether scroll bar will be moved automatically to show most recent log entries. + + + + + Indicates whether to create accessory form if the specified form/control combination was not found during target initialization. + + + + + Initial height of the form with rich text box. + + + + + Indicates whether to use default coloring rules. + + + + + Form created (true) or used an existing (false). Set after M:NLog.Windows.Forms.RichTextBoxTarget.InitializeTarget. Can be true only if P:NLog.Windows.Forms.RichTextBoxTarget.AllowAccessoryFormCreation is set to true (default). + + + + + If set to true, using "rtb-link" renderer (T:NLog.Windows.Forms.RichTextBoxLinkLayoutRenderer) would create clickable links in the control. E:NLog.Windows.Forms.RichTextBoxTarget.LinkClicked + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Background color. + + + + + Font color. + + + + + Font style of matched text. + + + + + Condition that must be met in order to set the specified font color. + + + + + + + + + + + + + + + + Background color. Names are identical with KnownColor enum extended with Empty value which means that background color won't be changed. + + + + + Font color. Names are identical with KnownColor enum extended with Empty value which means that font color won't be changed. + + + + + Font style of matched text. Possible values are the same as in FontStyle enum in System.Drawing. + + + + + Indicates whether to ignore case when comparing texts. + + + + + Regular expression to be matched. You must specify either text or regex. + + + + + Text to be matched. You must specify either text or regex. + + + + + Indicates whether to match whole words only. + + + + + + + + + + + + Name of the target. + + + + + + + + + + + + + + Name of the target. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Password for the custom SSL certificate specified by P:NLog.Targets.NetworkTarget.SslCertificateFile + + + + + File path to custom SSL certificate for TCP Socket SSL connections + + + + + SSL/TLS protocols. Default no SSL/TLS is used. Currently only implemented for TCP. + + + + + Action that should be taken, when more pending messages than P:NLog.Targets.NetworkTarget.MaxQueueSize. + + + + + Action that should be taken if the message is larger than P:NLog.Targets.NetworkTarget.MaxMessageSize + + + + + Action that should be taken, when more connections than P:NLog.Targets.NetworkTarget.MaxConnections. + + + + + The number of seconds a TCP socket send-operation will block before timeout error. Default = 100 secs (0 = wait forever when network cable unplugged and tcp-buffer becomes full). + + + + + Maximum simultaneous connections. Requires P:NLog.Targets.NetworkTarget.KeepConnection = false + + + + + Indicates whether to keep connection open whenever possible. + + + + + The number of seconds a connection will remain idle before the first keep-alive probe is sent + + + + + Size of the connection cache (number of connections which are kept alive). Requires P:NLog.Targets.NetworkTarget.KeepConnection = true + + + + + Network destination address. + + + + + Maximum queue size for a single connection. Requires P:NLog.Targets.NetworkTarget.KeepConnection = true + + + + + + + + + + + + + + + + + Whether to disable the delayed ACK timer, and avoid delay of 200 ms. Default = true. + + + + + + Skip compression when protocol payload is below limit to reduce overhead in cpu-usage and additional headers + + + + + Type of compression for protocol payload. Useful for UDP where datagram max-size is 8192 bytes. + + + + + Maximum message size in bytes. On limit breach then P:NLog.Targets.NetworkTarget.OnOverflow action is activated. + + + + + Encoding to be used. + + + + + End of line value if a newline is appended at the end of log message P:NLog.Targets.NetworkTarget.NewLine. + + + + + Indicates whether to append newline at the end of log message. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Layout used to format log messages. + + + + + Name of the Form on which the ToolStrip is located. + + + + + Name of the ToolStripItem to which NLog will log write log text. + + + + + Name of ToolStrip that contains the ToolStripItem to which NLog will log write log text. + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Text to be rendered. + + + + + Header. + + + + + Footer. + + + + + Forward F:NLog.LogLevel.Fatal to M:System.Diagnostics.Trace.Fail(System.String) (Instead of M:System.Diagnostics.Trace.TraceError(System.String)) + + + + + Force use M:System.Diagnostics.Trace.WriteLine(System.String) independent of T:NLog.LogLevel + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the target. + + + + + Encoding. + + + + + Should we include the BOM (Byte-order-mark) for UTF? Influences the P:NLog.Targets.WebServiceTarget.Encoding property. This will only work for UTF-8. + + + + + Web service method name. Only used with Soap. + + + + + Web service namespace. Only used with Soap. + + + + + Protocol to be used when calling web service. + + + + + Custom proxy address, include port separated by a colon + + + + + Proxy configuration when calling web service + + + + + Web service URL. + + + + + Value of the User-agent HTTP header. + + + + + Indicates whether to pre-authenticate the HttpWebRequest (Requires 'Authorization' in P:NLog.Targets.WebServiceTarget.Headers parameters) + + + + + Name of the root XML element, if POST of XML document chosen. If so, this property must not be null. (see P:NLog.Targets.WebServiceTarget.Protocol and F:NLog.Targets.WebServiceProtocol.XmlPost). + + + + + (optional) root namespace of the XML document, if POST of XML document chosen. (see P:NLog.Targets.WebServiceTarget.Protocol and F:NLog.Targets.WebServiceProtocol.XmlPost). + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Custom column delimiter value (valid when P:NLog.Layouts.CsvLayout.Delimiter is set to F:NLog.Layouts.CsvColumnDelimiterMode.Custom). + + + + + Column delimiter. + + + + + Footer layout. + + + + + Header layout. + + + + + Body layout (can be repeated multiple times). + + + + + Quote Character. + + + + + Quoting mode. + + + + + Indicates whether CVS should include header. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the column. + + + + + Layout used for rendering the column value. + + + + + Override of Quoting mode + + + + + + + + + + + + + + + + + + + + + + Option to exclude null/empty properties from the log event (as JSON) + + + + + List of property names to exclude when P:NLog.Layouts.GelfLayout.IncludeEventProperties is true + + + + + Whether to activate the legacy Graylog Message Facility-field + + + + + Graylog Message Full-Message-field + + + + + Graylog Message Host-field + + + + + Graylog Message Short-Message-field + + + + + Option to include all properties from the log events + + + + + List of property names to include when P:NLog.Layouts.GelfLayout.IncludeEventProperties is true + + + + + Whether to include the contents of the T:NLog.ScopeContext properties-dictionary. + + + + + + + + + + + + + + + + Option to render the empty object value {} + + + + + Option to suppress the extra spaces in the output json. Default: true + + + + + + + + + + + + + + + + + + + + + + + Option to include all properties from the log event (as JSON) + + + + + Indicates whether to include contents of the T:NLog.GlobalDiagnosticsContext dictionary. + + + + + Whether to include the contents of the T:NLog.ScopeContext dictionary. + + + + + Option to exclude null/empty properties from the log event (as JSON) + + + + + List of property names to exclude when P:NLog.Layouts.JsonLayout.IncludeAllProperties is true + + + + + Auto indent and create new lines + + + + + How far should the JSON serializer follow object references before backing off + + + + + Option to render the empty object value {} + + + + + Option to suppress the extra spaces in the output json. Default: true + + + + + + + + + + + + + + + + + + Name of the attribute. + + + + + Layout used for rendering the attribute value. + + + + + Fallback value when result value is not available + + + + + Whether output should be encoded as Json-String-Property, or be treated as valid json. + + + + + Indicates whether to escape non-ascii characters + + + + + Whether empty attribute value should be included in the output. Default = false + + + + + Result value type, for conversion of layout rendering output + + + + + + + + + + + + + + Footer layout. + + + + + Header layout. + + + + + Body layout (can be repeated multiple times). + + + + + + + + + + + + + + + + + + + + + + + + + + + Option to include all properties from the log events + + + + + Whether to include log4j:NDC in output from T:NLog.ScopeContext nested context. + + + + + Whether to include log4j:NDC in output from T:NLog.ScopeContext nested context. + + + + + Whether to include the contents of the T:NLog.ScopeContext properties-dictionary. + + + + + Stack separator for log4j:NDC in output from T:NLog.ScopeContext nested context. + + + + + Stack separator for log4j:NDC in output from T:NLog.ScopeContext nested context. + + + + + Whether the log4j:throwable xml-element should be written as CDATA + + + + + Log4j:event log4japp-xml-element. By default it's the friendly name of the current AppDomain. + + + + + Log4j:event message-xml-element. Default: ${message} + + + + + Indicates whether to include call site (class and method name) in the information sent over the network. + + + + + Indicates whether to include source info (file name and line number) in the information sent over the network. + + + + + Log4j:event logger-xml-attribute. Default: ${logger} + + + + + + + + + + + + + + + + + + + + + + + + + + Option to include all properties from the log event (as JSON) + + + + + Indicates whether to include contents of the T:NLog.GlobalDiagnosticsContext dictionary. + + + + + Whether to include the contents of the T:NLog.ScopeContext dictionary. + + + + + Option to exclude null/empty properties from the log event (as JSON) + + + + + List of property names to exclude when P:NLog.Layouts.JsonLayout.IncludeAllProperties is true + + + + + Auto indent and create new lines + + + + + How far should the JSON serializer follow object references before backing off + + + + + Option to render the empty object value {} + + + + + Option to suppress the extra spaces in the output json. Default: true + + + + + Whether to include "scopes"-section + + + + + Whether to include "Timestamp"-section + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Indicates whether LogEvent Properties should be included for StructuredData when P:NLog.Layouts.SyslogLayout.Rfc5424 = true + + + + + Indicates whether to use RFC 3164 for Syslog Format + + + + + Indicates whether to use RFC 5424 for Syslog Format + + + + + Prefix for StructuredData when P:NLog.Layouts.SyslogLayout.Rfc5424 = true + + + + + Name of the device / application / process sending the Syslog-message (Optional) + + + + + Device Facility + + + + + The FQDN or IPv4 address or IPv6 address or hostname of the sender machine (Optional) + + + + + Message Severity + + + + + Mesage Payload + + + + + The type of message that should be the same for events with the same semantics. Ex ${event-properties:EventId} (Optional) + + + + + Process Id or Process Name or Logger Name (Optional) + + + + + Indicates what DateTime format should be used when P:NLog.Layouts.SyslogLayout.Rfc5424 = true + + + + + + + + + + + + + + + + + + + Footer layout. + + + + + Header layout. + + + + + Body layout (can be repeated multiple times). + + + + + Newline to append after each directive header + + + + + + + + + + + + + Layout of the field. + + + + + Name of the field. + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the root XML element + + + + + Value inside the root XML element + + + + + Whether to include the contents of the T:NLog.ScopeContext dictionary. + + + + + List of property names to exclude when P:NLog.Layouts.XmlElementBase.IncludeEventProperties is true + + + + + Auto indent and create new lines + + + + + How far should the XML serializer follow object references before backing off + + + + + XML element name to use for rendering IList-collections items + + + + + XML attribute name to use when rendering property-key When null (or empty) then key-attribute is not included + + + + + XML element name to use when rendering properties + + + + + XML attribute name to use when rendering property-value When null (or empty) then value-attribute is not included and value is formatted as XML-element-value + + + + + Determines whether or not this attribute will be Xml encoded. + + + + + Whether empty XML-element should be included in the output. Default = false + + + + + Option to include all properties from the log event (as XML) + + + + + + + + + + + + + + + + + Name of the attribute. + + + + + Layout used for rendering the attribute value. + + + + + Fallback value when result value is not available + + + + + Whether output should be encoded with Xml-string escaping, or be treated as valid xml-attribute-value + + + + + Whether empty attribute value should be included in the output. Default = false + + + + + Result value type, for conversion of layout rendering output + + + + + + + + + + + + + + + + + + + + + + + + + + + Name of the element + + + + + Whether to include the contents of the T:NLog.ScopeContext dictionary. + + + + + Layout used for rendering the XML-element InnerText. + + + + + Value inside the element + + + + + Whether output should be encoded with XML-string escaping, or be treated as valid xml-element-value + + + + + List of property names to exclude when P:NLog.Layouts.XmlElementBase.IncludeEventProperties is true + + + + + Auto indent and create new lines + + + + + How far should the XML serializer follow object references before backing off + + + + + XML element name to use for rendering IList-collections items + + + + + XML attribute name to use when rendering property-key When null (or empty) then key-attribute is not included + + + + + XML element name to use when rendering properties + + + + + XML attribute name to use when rendering property-value When null (or empty) then value-attribute is not included and value is formatted as XML-element-value + + + + + Whether output should be wrapped using CDATA section instead of XML-string escaping + + + + + Whether empty XML-element should be included in the output. Default = false + + + + + Option to include all properties from the log event (as XML) + + + + + + + + + + + + + Action to be taken when filter matches. + + + + + Condition expression. + + + + + + + + + + + + + + + + + + + + + + + + + + Action to be taken when filter matches. + + + + + Indicates whether to ignore case when comparing strings. + + + + + Layout to be used to filter log messages. + + + + + Substring to be matched. + + + + + + + + + + + + + + + + + Action to be taken when filter matches. + + + + + String to compare the layout to. + + + + + Indicates whether to ignore case when comparing strings. + + + + + Layout to be used to filter log messages. + + + + + + + + + + + + + + + + + Action to be taken when filter matches. + + + + + Indicates whether to ignore case when comparing strings. + + + + + Layout to be used to filter log messages. + + + + + Substring to be matched. + + + + + + + + + + + + + + + + + Action to be taken when filter matches. + + + + + String to compare the layout to. + + + + + Indicates whether to ignore case when comparing strings. + + + + + Layout to be used to filter log messages. + + + + + + + + + + + + + + + + + + + + + + + Action to be taken when filter matches. + + + + + Append FilterCount to the P:NLog.LogEventInfo.Message when an event is no longer filtered + + + + + Insert FilterCount value into P:NLog.LogEventInfo.Properties when an event is no longer filtered + + + + + Applies the configured action to the initial logevent that starts the timeout period. Used to configure that it should ignore all events until timeout. + + + + + Layout to be used to filter log messages. + + + + + Max length of filter values, will truncate if above limit + + + + + How long before a filter expires, and logging is accepted again + + + + + Default number of unique filter values to expect, will automatically increase if needed + + + + + Max number of unique filter values to expect simultaneously + + + + + Default buffer size for the internal buffers + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/MyQianLiMa/PMS/ConfigData.cs b/MyQianLiMa/PMS/ConfigData.cs new file mode 100644 index 0000000..1d7ccd3 --- /dev/null +++ b/MyQianLiMa/PMS/ConfigData.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; + +namespace BLWWS.PMS +{ + public class ConfigData + { + public int Interval { get; set; } + public List DuiJieInfos { get; set; } + } + public class DuiJieInfo + { + public string zuzhi_code { get; set; } = ""; + public string hotel_code { get; set; } + } +} \ No newline at end of file diff --git a/MyQianLiMa/PMS/QHotelData.cs b/MyQianLiMa/PMS/QHotelData.cs new file mode 100644 index 0000000..d976266 --- /dev/null +++ b/MyQianLiMa/PMS/QHotelData.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; + +namespace BLWWS.PMS +{ + public class RData + { + public QHotelData integratedRequest { get; set; } + public ParamsData @params { get; set; } + } + public class QHotelData + { + public string hostName { get; set; } + public string lang { get; set; } + public string optCode { get; set; } + public string orgUnitNo { get; set; } + public string productCode { get; set; } + public string securityToken { get; set; } + public string userCode { get; set; } + } + public class ParamsData + { + public string gstStat { get; set; } + public string mixParam { get; set; } + } +} \ No newline at end of file diff --git a/MyQianLiMa/PMS/QianLiMaReturnInfo.cs b/MyQianLiMa/PMS/QianLiMaReturnInfo.cs new file mode 100644 index 0000000..8340041 --- /dev/null +++ b/MyQianLiMa/PMS/QianLiMaReturnInfo.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; + +namespace BLWWS.PMS +{ + public class QianLiMaReturnInfo + { + public int? count { get; set; } + public int? curPage { get; set; } + public int? errCode { get; set; } + public string errText { get; set; } + public List resultList { get; set; } + } + + public class CustomerData + { + public int accid { get; set; } + + /// + /// 证件号 + /// + public string docno { get; set; } + public string doctype { get; set; } + + + /// + /// + /// + public string gstTel { get; set; } + + /// + /// + /// + public string gstname { get; set; } + + /// + /// 房间号 + /// + public string rmno { get; set; } + } +} \ No newline at end of file diff --git a/MyQianLiMa/Properties/AssemblyInfo.cs b/MyQianLiMa/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..f436b6f --- /dev/null +++ b/MyQianLiMa/Properties/AssemblyInfo.cs @@ -0,0 +1,35 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的常规信息通过下列特性集 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("MyQianLiMa")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("MyQianLiMa")] +[assembly: AssemblyCopyright("Copyright © 2025")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 会使此程序集中的类型 +// 对 COM 组件不可见。如果需要 +// 从 COM 访问此程序集中的某个类型,请针对该类型将 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于 typelib 的 ID +[assembly: Guid("d7f82da5-dc79-4308-ba3e-304287123032")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 内部版本号 +// 修订版本 +// +// 可以指定所有值,也可以使用“修订号”和“内部版本号”的默认值, +// 方法是按如下所示使用 "*": +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/MyQianLiMa/Web.Debug.config b/MyQianLiMa/Web.Debug.config new file mode 100644 index 0000000..b9a9fde --- /dev/null +++ b/MyQianLiMa/Web.Debug.config @@ -0,0 +1,31 @@ + + + + + + + + + + \ No newline at end of file diff --git a/MyQianLiMa/Web.Release.config b/MyQianLiMa/Web.Release.config new file mode 100644 index 0000000..755e745 --- /dev/null +++ b/MyQianLiMa/Web.Release.config @@ -0,0 +1,32 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/MyQianLiMa/Web.config b/MyQianLiMa/Web.config new file mode 100644 index 0000000..a7d6379 --- /dev/null +++ b/MyQianLiMa/Web.config @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/MyQianLiMa/WebForm1.aspx b/MyQianLiMa/WebForm1.aspx new file mode 100644 index 0000000..23bf2b4 --- /dev/null +++ b/MyQianLiMa/WebForm1.aspx @@ -0,0 +1,62 @@ +<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="MyQianLiMa.WebForm1" %> + + + + + + + + + +
+
+ + + + +
+
+
+ +
+
+ + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+ + diff --git a/MyQianLiMa/WebForm1.aspx.cs b/MyQianLiMa/WebForm1.aspx.cs new file mode 100644 index 0000000..f9a641f --- /dev/null +++ b/MyQianLiMa/WebForm1.aspx.cs @@ -0,0 +1,99 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Web; +using System.Web.UI; +using System.Web.UI.WebControls; +using BLWWS.PMS; + +namespace MyQianLiMa +{ + public partial class WebForm1 : System.Web.UI.Page + { + + protected void Page_Load(object sender, EventArgs e) + { + if (!IsPostBack) + { + var q = Application["config"]; + var D = (ConfigData)q; + int v = D.Interval; + this.TextBox1.Text = v.ToString(); + this.GridView1.DataSource = D.DuiJieInfos; + this.GridView1.DataBind(); + } + } + + protected void Button1_Click(object sender, EventArgs e) + { + try + { + var q = Application["config"]; + var D = (ConfigData)q; + int a = 10; + int.TryParse(this.TextBox1.Text, out a); + D.Interval = a; + + SaveData2File(D); + + this.Label12.Text = "保存成功"; + } + catch (Exception ex) + { + this.Label12.Text = "保存失败。原因: " + ex.Message; + } + } + + protected void Button2_Click(object sender, EventArgs e) + { + } + + protected void Button3_Click(object sender, EventArgs e) + { + var q = Application["config"]; + var D = (ConfigData)q; + + DuiJieInfo ddd = new DuiJieInfo(); + ddd.hotel_code = this.txthotelcode.Text; + D.DuiJieInfos.Add(ddd); + SaveData2File(D); + + this.GridView1.DataSource = D.DuiJieInfos; + this.GridView1.DataBind(); + } + + private void SaveData2File(ConfigData D) + { + string str = Newtonsoft.Json.JsonConvert.SerializeObject(D); + string filepath = Server.MapPath("config.json"); + File.WriteAllText(filepath, str); + } + + protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e) + { + if (e.CommandName == "Delete") + { + var q = Application["config"]; + var D = (ConfigData)q; + + var d = D.DuiJieInfos.FirstOrDefault(A => A.hotel_code == e.CommandArgument.ToString()); + D.DuiJieInfos.Remove(d); + + SaveData2File(D); + + this.GridView1.DataSource = D.DuiJieInfos; + this.GridView1.DataBind(); + } + } + + protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e) + { + + } + } + public struct VVV + { + public string name; + } +} \ No newline at end of file diff --git a/MyQianLiMa/WebForm1.aspx.designer.cs b/MyQianLiMa/WebForm1.aspx.designer.cs new file mode 100644 index 0000000..ac3398e --- /dev/null +++ b/MyQianLiMa/WebForm1.aspx.designer.cs @@ -0,0 +1,107 @@ +//------------------------------------------------------------------------------ +// <自动生成> +// 此代码由工具生成。 +// +// 对此文件的更改可能导致不正确的行为,如果 +// 重新生成代码,则所做更改将丢失。 +// +//------------------------------------------------------------------------------ + +namespace MyQianLiMa +{ + + + public partial class WebForm1 + { + + /// + /// form1 控件。 + /// + /// + /// 自动生成的字段。 + /// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。 + /// + protected global::System.Web.UI.HtmlControls.HtmlForm form1; + + /// + /// Label1 控件。 + /// + /// + /// 自动生成的字段。 + /// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。 + /// + protected global::System.Web.UI.WebControls.Label Label1; + + /// + /// TextBox1 控件。 + /// + /// + /// 自动生成的字段。 + /// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。 + /// + protected global::System.Web.UI.WebControls.TextBox TextBox1; + + /// + /// Button1 控件。 + /// + /// + /// 自动生成的字段。 + /// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。 + /// + protected global::System.Web.UI.WebControls.Button Button1; + + /// + /// Label12 控件。 + /// + /// + /// 自动生成的字段。 + /// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。 + /// + protected global::System.Web.UI.WebControls.Label Label12; + + /// + /// Panel1 控件。 + /// + /// + /// 自动生成的字段。 + /// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。 + /// + protected global::System.Web.UI.WebControls.Panel Panel1; + + /// + /// Label11 控件。 + /// + /// + /// 自动生成的字段。 + /// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。 + /// + protected global::System.Web.UI.WebControls.Label Label11; + + /// + /// txthotelcode 控件。 + /// + /// + /// 自动生成的字段。 + /// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。 + /// + protected global::System.Web.UI.WebControls.TextBox txthotelcode; + + /// + /// Button3 控件。 + /// + /// + /// 自动生成的字段。 + /// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。 + /// + protected global::System.Web.UI.WebControls.Button Button3; + + /// + /// GridView1 控件。 + /// + /// + /// 自动生成的字段。 + /// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。 + /// + protected global::System.Web.UI.WebControls.GridView GridView1; + } +} diff --git a/MyQianLiMa/config.json b/MyQianLiMa/config.json new file mode 100644 index 0000000..1809c2d --- /dev/null +++ b/MyQianLiMa/config.json @@ -0,0 +1 @@ +{"Interval":20,"DuiJieInfos":[{"zuzhi_code":"","hotel_code":"1002"},{"zuzhi_code":"","hotel_code":"1003"}]} \ No newline at end of file diff --git a/MyQianLiMa/nlog.config b/MyQianLiMa/nlog.config new file mode 100644 index 0000000..3fc858e --- /dev/null +++ b/MyQianLiMa/nlog.config @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/MyQianLiMa/packages.config b/MyQianLiMa/packages.config new file mode 100644 index 0000000..bcbda51 --- /dev/null +++ b/MyQianLiMa/packages.config @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/PMSLogProduce/.config/dotnet-tools.json b/PMSLogProduce/.config/dotnet-tools.json new file mode 100644 index 0000000..ef95326 --- /dev/null +++ b/PMSLogProduce/.config/dotnet-tools.json @@ -0,0 +1,13 @@ +{ + "version": 1, + "isRoot": true, + "tools": { + "dotnet-ef": { + "version": "9.0.9", + "commands": [ + "dotnet-ef" + ], + "rollForward": false + } + } +} \ No newline at end of file diff --git a/PMSLogProduce/CSRedisCacheHelper.cs b/PMSLogProduce/CSRedisCacheHelper.cs new file mode 100644 index 0000000..90ecb4a --- /dev/null +++ b/PMSLogProduce/CSRedisCacheHelper.cs @@ -0,0 +1,91 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Configuration; +using CSRedis; + +namespace BLWWS_BLL.Common +{ + /// + /// Redis缓存辅助类 + /// + public class CSRedisCacheHelper + { + public static CSRedisClient redis; + public static CSRedisClient redis3; + public static CSRedisClient redis5; + + private const string ip = "127.0.0.1"; + private const string port = "6379"; + static CSRedisCacheHelper() + { + var redisHostStr = string.Format("{0}:{1}", ip, port); + if (!string.IsNullOrEmpty(redisHostStr)) + { + redis = new CSRedisClient(redisHostStr + ",password=,defaultDatabase=1"); + redis3 = new CSRedisClient(redisHostStr + ",password=,defaultDatabase=3"); + //准备存储取电数据 + redis5 = new CSRedisClient(redisHostStr + ",password=,defaultDatabase=5"); + //string channel = "__keyevent@1__:expired"; + //var QQQ = new ValueTuple>(channel, (msg) => + // { + // if (channel.Equals("")) + // { + + // } + // Console.WriteLine(msg.MessageId); + // Console.WriteLine(msg.Body); + // Console.WriteLine("11111111"); + // }); + //redis.Subscribe(QQQ); + } + } + /// + /// 添加缓存 + /// + /// + /// + /// + public static void Set(string key, T value, int ExpireTime) + { + redis?.Set(key, value, ExpireTime * 60); + } + + public static T Get(string key) + { + return redis.Get(key); + } + + public static void Forever(string key, T value) + { + redis.Set(key, value, -1); + } + public static void Del(string key) + { + redis.Del(key); + } + + /// + /// 判断是否存在 + /// + /// + /// + /// + public static bool Contains(string key, string mac) + { + bool result = redis.Exists(mac); + if (!result) + { + result = redis.Exists(key); + } + return result; + } + + public static bool Contains(string key) + { + bool result = redis.Exists(key); + return result; + } + } +} diff --git a/PMSLogProduce/Controllers/WeatherForecastController.cs b/PMSLogProduce/Controllers/WeatherForecastController.cs new file mode 100644 index 0000000..149f4b6 --- /dev/null +++ b/PMSLogProduce/Controllers/WeatherForecastController.cs @@ -0,0 +1,33 @@ +using Microsoft.AspNetCore.Mvc; + +namespace PMSLogProduce.Controllers +{ + [ApiController] + [Route("[controller]")] + public class WeatherForecastController : ControllerBase + { + private static readonly string[] Summaries = new[] + { + "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" + }; + + private readonly ILogger _logger; + + public WeatherForecastController(ILogger logger) + { + _logger = logger; + } + + [HttpGet] + public IEnumerable Get() + { + return Enumerable.Range(1, 5).Select(index => new WeatherForecast + { + Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)), + TemperatureC = Random.Shared.Next(-20, 55), + Summary = Summaries[Random.Shared.Next(Summaries.Length)] + }) + .ToArray(); + } + } +} diff --git a/PMSLogProduce/Models/Entity.cs b/PMSLogProduce/Models/Entity.cs new file mode 100644 index 0000000..911d2d6 --- /dev/null +++ b/PMSLogProduce/Models/Entity.cs @@ -0,0 +1,222 @@ +using MessagePack; + +namespace PMSLogProduce.Models +{ + public class Root + { + public List data { get; set; } + } + public class DataItem + { + /// + /// + /// + public string ExtendedLocation { get; set; } + /// + /// + /// + public string OriginQuery { get; set; } + /// + /// + /// + public string appinfo { get; set; } + /// + /// + /// + public int disp_type { get; set; } + /// + /// + /// + public string fetchkey { get; set; } + /// + /// 本地局域网 + /// + public string location { get; set; } + /// + /// + /// + public string origip { get; set; } + /// + /// + /// + public string origipquery { get; set; } + /// + /// + /// + public string resourceid { get; set; } + /// + /// + /// + public int role_id { get; set; } + /// + /// + /// + public int shareImage { get; set; } + /// + /// + /// + public int showLikeShare { get; set; } + /// + /// + /// + public string showlamp { get; set; } + /// + /// IP地址查询 + /// + public string titlecont { get; set; } + /// + /// + /// + public string tplt { get; set; } + } + + + [MessagePackObject()] + public class CheckInYuanShidata + { + [Key(0)] + public string? CommandType { get; set; } + + [Key(1)] + public double Step { get; set; } + + [Key(2)] + public string? IP { get; set; } + + [Key(3)] + public string? RequestId { get; set; } + + [Key(4)] + public ZhiJie? ZhiJieData { get; set; } + + [Key(5)] + public JianJie? JianJieData { get; set; } + + [Key(6)] + public DateTime CurrentTime { get; set; } + } + + [MessagePackObject()] + public class ZhiJie + { + [Key(0)] + public CheckInData? CheckInData { get; set; } + + [Key(1)] + public CheckOutData? CheckOutData { get; set; } + + [Key(2)] + public RentData? RentData { get; set; } + } + + [MessagePackObject()] + public class JianJie + { + [Key(0)] + public string? OriginallData { get; set; } + } + + [MessagePackObject()] + public class CheckInData + { + [Key(0)] + public string? key { get; set; } + + [Key(1)] + public string? code { get; set; } + + [Key(2)] + public string? roomNumber { get; set; } + + [Key(3)] + public DateTime checkInDate; + + [Key(4)] + public string? xmlString { get; set; } + + [Key(5)] + public string? phoneNumber { get; set; } + + [Key(6)] + public string? idNumber { get; set; } + } + + [MessagePackObject()] + public class CheckOutData + { + + [Key(0)] + public string? key { get; set; } + + [Key(1)] + public string? code { get; set; } + + [Key(2)] + public string? roomNumber { get; set; } + + [Key(3)] + public DateTime checkOutDate { get; set; } + } + + [MessagePackObject()] + public class RentData + { + [Key(0)] + public string? key { get; set; } + + [Key(1)] + public string? code { get; set; } + + [Key(2)] + public string? roomNumber { get; set; } + + [Key(3)] + public DateTime rentDate { get; set; } + } + + //public class CheckInYuanShidata + //{ + // public string CommandType { get; set; } + // public double Step { get; set; } + // public string IP { get; set; } + + // public string RequestId { get; set; } + // public JianJie JianJieData { get; set; } + // public ZhiJie ZhiJieData { get; set; } + // public DateTime CurrentTime { get; set; } + //} + //public class JianJie + //{ + // public string OriginallData { get; set; } + //} + //public class ZhiJie + //{ + // public CheckInData CheckInData { get; set; } + // public CheckOutData CheckOutData { get; set; } + // public RentData RentData { get; set; } + //} + //public class CheckInData + //{ + // public string key { get; set; } + // public string code { get; set; } + // public string roomNumber { get; set; } + // public DateTime checkInDate; + // public string xmlString { get; set; } + // public string phoneNumber { get; set; } + // public string idNumber { get; set; } + //} + //public class CheckOutData + //{ + // public string key { get; set; } + // public string code { get; set; } + // public string roomNumber { get; set; } + // public DateTime checkOutDate { get; set; } + //} + //public class RentData + //{ + // public string key { get; set; } + // public string code { get; set; } + // public string roomNumber { get; set; } + // public DateTime rentDate { get; set; } + //} +} diff --git a/PMSLogProduce/PMSLogProduce.csproj b/PMSLogProduce/PMSLogProduce.csproj new file mode 100644 index 0000000..63aa8f0 --- /dev/null +++ b/PMSLogProduce/PMSLogProduce.csproj @@ -0,0 +1,17 @@ + + + + net8.0 + enable + enable + + + + + + + + + + + diff --git a/PMSLogProduce/PMSLogProduce.http b/PMSLogProduce/PMSLogProduce.http new file mode 100644 index 0000000..4287e0d --- /dev/null +++ b/PMSLogProduce/PMSLogProduce.http @@ -0,0 +1,6 @@ +@PMSLogProduce_HostAddress = http://localhost:5157 + +GET {{PMSLogProduce_HostAddress}}/weatherforecast/ +Accept: application/json + +### diff --git a/PMSLogProduce/Program.cs b/PMSLogProduce/Program.cs new file mode 100644 index 0000000..4614fd7 --- /dev/null +++ b/PMSLogProduce/Program.cs @@ -0,0 +1,29 @@ +using BLWLogProduce.Services; + +namespace PMSLogProduce +{ + public class Program + { + public static void Main(string[] args) + { + var builder = WebApplication.CreateBuilder(args); + + // Add services to the container. + + builder.Services.AddControllers(); + builder.Services.AddMemoryCache(); + builder.Services.AddHostedService(); + + var app = builder.Build(); + + // Configure the HTTP request pipeline. + + app.UseAuthorization(); + + + app.MapControllers(); + + app.Run(); + } + } +} diff --git a/PMSLogProduce/Properties/launchSettings.json b/PMSLogProduce/Properties/launchSettings.json new file mode 100644 index 0000000..712ecc2 --- /dev/null +++ b/PMSLogProduce/Properties/launchSettings.json @@ -0,0 +1,31 @@ +{ + "$schema": "http://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:55946", + "sslPort": 0 + } + }, + "profiles": { + "http": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "weatherforecast", + "applicationUrl": "http://localhost:5157", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "weatherforecast", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/PMSLogProduce/Services/KafkaProduce.cs b/PMSLogProduce/Services/KafkaProduce.cs new file mode 100644 index 0000000..dffb947 --- /dev/null +++ b/PMSLogProduce/Services/KafkaProduce.cs @@ -0,0 +1,113 @@ + +using System.Text; +using System.Text.Json; +using System.Threading.Channels; +using BLWWS_BLL.Common; +using Confluent.Kafka; +using MessagePack; +using Microsoft.Extensions.Caching.Memory; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using NLog; +using PMSLogProduce.Models; +using RestSharp; +using static CSRedis.CSRedisClient; + +namespace BLWLogProduce.Services +{ + public class KafkaProduce : BackgroundService + { + public IConfiguration Configuration { get; set; } + public IMemoryCache _Cache { get; set; } + + public KafkaProduce(IConfiguration configuration, IMemoryCache cache) + { + this.Configuration = configuration; + _Cache = cache; + } + public static Logger logger = LogManager.GetCurrentClassLogger(); + protected async override Task ExecuteAsync(CancellationToken stoppingToken) + { + await Task.Factory.StartNew((state) => + { + try + { + string? ipport = Configuration["Kafka:EndPoint"]; + string? user = Configuration["Kafka:UserName"]; + string? pwd = Configuration["Kafka:PassWord"]; + var config = new ProducerConfig + { + BootstrapServers = ipport, + SecurityProtocol = SecurityProtocol.SaslPlaintext, + SaslMechanism = SaslMechanism.Plain, + SaslUsername = user, + SaslPassword = pwd + }; + var p = new ProducerBuilder(config).Build(); + + var DingYue1 = ("PMSLogMonitor", new Action(async (args) => + { + string body = args.Body; + + CheckInYuanShidata? usa = System.Text.Json.JsonSerializer.Deserialize(body); + byte[] bytes = MessagePackSerializer.Serialize(usa); + + string TopicKey = "blwlog-rcu-udppackage-topic"; + string DetailKey = "pms"; + Console.WriteLine("推送了数据"); + await p.ProduceAsync(TopicKey, new Message { Key = DetailKey, Value = bytes }); + })); + + CSRedisCacheHelper.redis3.Subscribe(DingYue1); + } + catch (Exception ex) + { + logger.Error(ex.Message); + } + }, TaskCreationOptions.LongRunning); + } + + + /// + /// 百度api + /// + /// + public static string GetBaiduIp(string ip) + { + string location = ""; + try + { + string url = $"https://sp0.baidu.com"; + //WebClient client = new WebClient(); + RestSharp.RestClient client1 = new RestSharp.RestClient(url); + RestSharp.RestRequest request = new RestSharp.RestRequest($"/8aQDcjqpAAV3otqbppnN2DJv/api.php?query={ip}&co=&resource_id=6006&oe=utf8", Method.Get); + var buffer = client1.DownloadData(request); + //var buffer = client.DownloadData(url); + string jsonText = Encoding.UTF8.GetString(buffer); + JObject jo = JObject.Parse(jsonText); + + Root root = JsonConvert.DeserializeObject(jo.ToString()); + foreach (var item in root.data) + { + location = item.location; + } + return location; + } + catch (Exception ex) + { + //Console.WriteLine(ex); + return location; + } + + } + + public static async Task ConsumeMessagesAsync() + { + while (true) + { + //if (_messageChannel.Reader.TryRead(out var nnn)) + //{ } + } + } + } +} diff --git a/PMSLogProduce/WeatherForecast.cs b/PMSLogProduce/WeatherForecast.cs new file mode 100644 index 0000000..2934c70 --- /dev/null +++ b/PMSLogProduce/WeatherForecast.cs @@ -0,0 +1,13 @@ +namespace PMSLogProduce +{ + public class WeatherForecast + { + public DateOnly Date { get; set; } + + public int TemperatureC { get; set; } + + public int TemperatureF => 32 + (int)(TemperatureC / 0.5556); + + public string? Summary { get; set; } + } +} diff --git a/PMSLogProduce/appsettings.Development.json b/PMSLogProduce/appsettings.Development.json new file mode 100644 index 0000000..0c208ae --- /dev/null +++ b/PMSLogProduce/appsettings.Development.json @@ -0,0 +1,8 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + } +} diff --git a/PMSLogProduce/appsettings.json b/PMSLogProduce/appsettings.json new file mode 100644 index 0000000..7a633a2 --- /dev/null +++ b/PMSLogProduce/appsettings.json @@ -0,0 +1,14 @@ +{ + "Kafka": { + "EndPoint": "43.138.217.154:9092", + "UserName": "blwmomo", + "PassWord": "blwmomo" + }, + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*" +} diff --git a/RestSharp/RestSharp.dll b/RestSharp/RestSharp.dll new file mode 100644 index 0000000000000000000000000000000000000000..1d40611c42388b154dd35810652400f70518e6ee GIT binary patch literal 163328 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 literal 0 HcmV?d00001 diff --git a/RestSharp/RestSharp.xml b/RestSharp/RestSharp.xml new file mode 100644 index 0000000..2d9254b --- /dev/null +++ b/RestSharp/RestSharp.xml @@ -0,0 +1,2897 @@ + + + + RestSharp + + + + + Default JSON serializer for request bodies + Doesn't currently use the SerializeAs attribute, defers to Newtonsoft's attributes + + + + + Default serializer + + + + + Serialize the object as JSON + + Object to serialize + JSON as String + + + + Unused for JSON Serialization + + + + + Unused for JSON Serialization + + + + + Unused for JSON Serialization + + + + + Content type for serialized content + + + + + Base class for common properties shared by RestResponse and RestResponse[[T]] + + + + + Default constructor + + + + + Assists with debugging responses by displaying in the debugger output + + + + + + The RestRequest that was made to get this RestResponse + + + Mainly for debugging if ResponseStatus is not OK + + + + + MIME content type of response + + + + + Length in bytes of the response content + + + + + Encoding of the response content + + + + + String representation of response content + + + + + HTTP response status code + + + + + Description of HTTP status returned + + + + + Response content + + + + + The URL that actually responded to the content (different from request if redirected) + + + + + HttpWebResponse.Server + + + + + Cookies returned by server with the response + + + + + Headers returned by server with the response + + + + + Status of the request. Will return Error for transport errors. + HTTP errors will still return ResponseStatus.Completed, check StatusCode instead + + + + + Transport or other non-HTTP error generated while attempting request + + + + + The exception thrown during the request, if any + + + + + The HTTP protocol version (1.0, 1.1, etc) + + Only set when underlying framework supports it. + + + + Container for data sent back from API including deserialized data + + Type of data to deserialize to + + + + Container for data sent back from API including deserialized data + + Type of data to deserialize to + + + + Container for data sent back from API + + + + + The RestRequest that was made to get this RestResponse + + + Mainly for debugging if ResponseStatus is not OK + + + + + MIME content type of response + + + + + Length in bytes of the response content + + + + + Encoding of the response content + + + + + String representation of response content + + + + + HTTP response status code + + + + + Description of HTTP status returned + + + + + Response content + + + + + The URL that actually responded to the content (different from request if redirected) + + + + + HttpWebResponse.Server + + + + + Cookies returned by server with the response + + + + + Headers returned by server with the response + + + + + Status of the request. Will return Error for transport errors. + HTTP errors will still return ResponseStatus.Completed, check StatusCode instead + + + + + Transport or other non-HTTP error generated while attempting request + + + + + Exceptions thrown during the request, if any. + + Will contain only network transport or framework exceptions thrown during the request. + HTTP protocol errors are handled by RestSharp and will not appear here. + + + + The HTTP protocol version (1.0, 1.1, etc) + + Only set when underlying framework supports it. + + + + Deserialized entity data + + + + + Deserialized entity data + + + + + Container for data sent back from API + + + + + Representation of an HTTP parameter (QueryString or Form value) + + + + + Name of the parameter + + + + + Value of the parameter + + + + + Content-Type of the parameter + + + + + HTTP response data + + + + + HTTP response data + + + + + MIME content type of response + + + + + Length in bytes of the response content + + + + + Encoding of the response content + + + + + String representation of response content + + + + + HTTP response status code + + + + + Description of HTTP status returned + + + + + Response content + + + + + The URL that actually responded to the content (different from request if redirected) + + + + + HttpWebResponse.Server + + + + + Headers returned by server with the response + + + + + Cookies returned by server with the response + + + + + Status of the request. Will return Error for transport errors. + HTTP errors will still return ResponseStatus.Completed, check StatusCode instead + + + + + Transport or other non-HTTP error generated while attempting request + + + + + Exception thrown when error is encountered. + + + + + The HTTP protocol version (1.0, 1.1, etc) + + Only set when underlying framework supports it. + + + + Default constructor + + + + + MIME content type of response + + + + + Length in bytes of the response content + + + + + Encoding of the response content + + + + + Lazy-loaded string representation of response content + + + + + HTTP response status code + + + + + Description of HTTP status returned + + + + + Response content + + + + + The URL that actually responded to the content (different from request if redirected) + + + + + HttpWebResponse.Server + + + + + Headers returned by server with the response + + + + + Cookies returned by server with the response + + + + + Status of the request. Will return Error for transport errors. + HTTP errors will still return ResponseStatus.Completed, check StatusCode instead + + + + + Transport or other non-HTTP error generated while attempting request + + + + + Exception thrown when error is encountered. + + + + + The HTTP protocol version (1.0, 1.1, etc) + + Only set when underlying framework supports it. + + + + Wrapper for System.Xml.Serialization.XmlSerializer. + + + + + Default constructor, does not specify namespace + + + + + Specify the namespaced to be used when serializing + + XML namespace + + + + Serialize the object as XML + + Object to serialize + XML as string + + + + Name of the root element to use when serializing + + + + + XML namespace to use when serializing + + + + + Format string to use when serializing dates + + + + + Content type for serialized content + + + + + Encoding for serialized content + + + + + Need to subclass StringWriter in order to override Encoding + + + + + Container for files to be uploaded with requests + + + + + Creates a file parameter from an array of bytes. + + The parameter name to use in the request. + The data to use as the file's contents. + The filename to use in the request. + The content type to use in the request. + The + + + + Creates a file parameter from an array of bytes. + + The parameter name to use in the request. + The data to use as the file's contents. + The filename to use in the request. + The using the default content type. + + + + The length of data to be sent + + + + + Provides raw data for file + + + + + Name of the file to use when uploading + + + + + MIME content type of file + + + + + Name of the parameter + + + + + XML Extension Methods + + + + + Returns the name of an element with the namespace if specified + + Element name + XML Namespace + + + + + + + + Helper methods for validating values + + + + + Validate an integer value is between the specified values (exclusive of min/max) + + Value to validate + Exclusive minimum value + Exclusive maximum value + + + + Validate a string length + + String to be validated + Maximum length of the string + + + + Container for data used to make requests + + + + + Adds a file to the Files collection to be included with a POST or PUT request + (other methods do not support file uploads). + + The parameter name to use in the request + Full path to file to upload + The MIME type of the file to upload + This request + + + + Adds the bytes to the Files collection with the specified file name and content type + + The parameter name to use in the request + The file data + The file name to use for the uploaded file + The MIME type of the file to upload + This request + + + + Adds the bytes to the Files collection with the specified file name and content type + + The parameter name to use in the request + A function that writes directly to the stream. Should NOT close the stream. + The file name to use for the uploaded file + The length (in bytes) of the file content. + The MIME type of the file to upload + This request + + + + Add bytes to the Files collection as if it was a file of specific type + + A form parameter name + The file data + The file name to use for the uploaded file + Specific content type. Es: application/x-gzip + + + + + Serializes obj to format specified by RequestFormat, but passes xmlNamespace if using the default XmlSerializer + The default format is XML. Change RequestFormat if you wish to use a different serialization format. + + The object to serialize + The XML namespace to use when serializing + This request + + + + Serializes obj to data format specified by RequestFormat and adds it to the request body. + The default format is XML. Change RequestFormat if you wish to use a different serialization format. + + The object to serialize + This request + + + + Serializes obj to JSON format and adds it to the request body. + + The object to serialize + This request + + + + Serializes obj to XML format and adds it to the request body. + + The object to serialize + This request + + + + Serializes obj to format specified by RequestFormat, but passes xmlNamespace if using the default XmlSerializer + Serializes obj to XML format and passes xmlNamespace then adds it to the request body. + + The object to serialize + The XML namespace to use when serializing + This request + + + + Calls AddParameter() for all public, readable properties specified in the includedProperties list + + + request.AddObject(product, "ProductId", "Price", ...); + + The object with properties to add as parameters + The names of the properties to include + This request + + + + Calls AddParameter() for all public, readable properties of obj + + The object with properties to add as parameters + This request + + + + Add the parameter to the request + + Parameter to add + + + + + Adds a HTTP parameter to the request (QueryString for GET, DELETE, OPTIONS and HEAD; Encoded form for POST and PUT) + + Name of the parameter + Value of the parameter + This request + + + + Adds a parameter to the request. There are five types of parameters: + - GetOrPost: Either a QueryString value or encoded form value based on method + - HttpHeader: Adds the name/value pair to the HTTP request's Headers collection + - UrlSegment: Inserted into URL if there is a matching url token e.g. {AccountId} + - Cookie: Adds the name/value pair to the HTTP request's Cookies collection + - RequestBody: Used by AddBody() (not recommended to use directly) + + Name of the parameter + Value of the parameter + The type of parameter to add + This request + + + + Adds a parameter to the request. There are five types of parameters: + - GetOrPost: Either a QueryString value or encoded form value based on method + - HttpHeader: Adds the name/value pair to the HTTP request's Headers collection + - UrlSegment: Inserted into URL if there is a matching url token e.g. {AccountId} + - Cookie: Adds the name/value pair to the HTTP request's Cookies collection + - RequestBody: Used by AddBody() (not recommended to use directly) + + Name of the parameter + Value of the parameter + Content-Type of the parameter + The type of parameter to add + This request + + + + Shortcut to AddParameter(name, value, HttpHeader) overload + + Name of the header to add + Value of the header to add + + + + + Shortcut to AddParameter(name, value, Cookie) overload + + Name of the cookie to add + Value of the cookie to add + + + + + Shortcut to AddParameter(name, value, UrlSegment) overload + + Name of the segment to add + Value of the segment to add + + + + + Shortcut to AddParameter(name, value, QueryString) overload + + Name of the parameter to add + Value of the parameter to add + + + + + Always send a multipart/form-data request - even when no Files are present. + + + + + Serializer to use when writing JSON request bodies. Used if RequestFormat is Json. + By default the included JsonSerializer is used (currently using JSON.NET default serialization). + + + + + Serializer to use when writing XML request bodies. Used if RequestFormat is Xml. + By default the included XmlSerializer is used. + + + + + Set this to write response to Stream rather than reading into memory. + + + + + Container of all HTTP parameters to be passed with the request. + See AddParameter() for explanation of the types of parameters that can be passed + + + + + Container of all the files to be uploaded with the request. + + + + + Determines what HTTP method to use for this request. Supported methods: GET, POST, PUT, DELETE, HEAD, OPTIONS + Default is GET + + + + + The Resource URL to make the request against. + Tokens are substituted with UrlSegment parameters and match by name. + Should not include the scheme or domain. Do not include leading slash. + Combined with RestClient.BaseUrl to assemble final URL: + {BaseUrl}/{Resource} (BaseUrl is scheme + domain, e.g. http://example.com) + + + // example for url token replacement + request.Resource = "Products/{ProductId}"; + request.AddParameter("ProductId", 123, ParameterType.UrlSegment); + + + + + Serializer to use when writing XML request bodies. Used if RequestFormat is Xml. + By default XmlSerializer is used. + + + + + Used by the default deserializers to determine where to start deserializing from. + Can be used to skip container or root elements that do not have corresponding deserialzation targets. + + + + + Used by the default deserializers to explicitly set which date format string to use when parsing dates. + + + + + Used by XmlDeserializer. If not specified, XmlDeserializer will flatten response by removing namespaces from element names. + + + + + In general you would not need to set this directly. Used by the NtlmAuthenticator. + + + + + Timeout in milliseconds to be used for the request. This timeout value overrides a timeout set on the RestClient. + + + + + The number of milliseconds before the writing or reading times out. This timeout value overrides a timeout set on the RestClient. + + + + + How many attempts were made to send this Request? + + + This Number is incremented each time the RestClient sends the request. + Useful when using Asynchronous Execution with Callbacks + + + + + Determine whether or not the "default credentials" (e.g. the user account under which the current process is running) + will be sent along to the server. The default is false. + + + + + Default constructor + + + + + Sets Method property to value of method + + Method to use for this request + + + + Sets Resource property + + Resource to use for this request + + + + Sets Resource and Method properties + + Resource to use for this request + Method to use for this request + + + + Sets Resource property + + Resource to use for this request + + + + Sets Resource and Method properties + + Resource to use for this request + Method to use for this request + + + + Adds a file to the Files collection to be included with a POST or PUT request + (other methods do not support file uploads). + + The parameter name to use in the request + Full path to file to upload + The MIME type of the file to upload + This request + + + + Adds the bytes to the Files collection with the specified file name + + The parameter name to use in the request + The file data + The file name to use for the uploaded file + The MIME type of the file to upload + This request + + + + Adds the bytes to the Files collection with the specified file name and content type + + The parameter name to use in the request + A function that writes directly to the stream. Should NOT close the stream. + The file name to use for the uploaded file + The length (in bytes) of the file content. + The MIME type of the file to upload + This request + + + + Add bytes to the Files collection as if it was a file of specific type + + A form parameter name + The file data + The file name to use for the uploaded file + Specific content type. Es: application/x-gzip + + + + + Serializes obj to format specified by RequestFormat, but passes xmlNamespace if using the default XmlSerializer + The default format is XML. Change RequestFormat if you wish to use a different serialization format. + + The object to serialize + The XML namespace to use when serializing + This request + + + + Serializes obj to data format specified by RequestFormat and adds it to the request body. + The default format is XML. Change RequestFormat if you wish to use a different serialization format. + + The object to serialize + This request + + + + Serializes obj to JSON format and adds it to the request body. + + The object to serialize + This request + + + + Serializes obj to XML format and adds it to the request body. + + The object to serialize + This request + + + + Serializes obj to format specified by RequestFormat, but passes xmlNamespace if using the default XmlSerializer + Serializes obj to XML format and passes xmlNamespace then adds it to the request body. + + The object to serialize + The XML namespace to use when serializing + This request + + + + Calls AddParameter() for all public, readable properties specified in the includedProperties list + + + request.AddObject(product, "ProductId", "Price", ...); + + The object with properties to add as parameters + The names of the properties to include + This request + + + + Calls AddParameter() for all public, readable properties of obj + + The object with properties to add as parameters + This request + + + + Add the parameter to the request + + Parameter to add + + + + + Adds a HTTP parameter to the request (QueryString for GET, DELETE, OPTIONS and HEAD; Encoded form for POST and PUT) + + Name of the parameter + Value of the parameter + This request + + + + Adds a parameter to the request. There are four types of parameters: + - GetOrPost: Either a QueryString value or encoded form value based on method + - HttpHeader: Adds the name/value pair to the HTTP request's Headers collection + - UrlSegment: Inserted into URL if there is a matching url token e.g. {AccountId} + - RequestBody: Used by AddBody() (not recommended to use directly) + + Name of the parameter + Value of the parameter + The type of parameter to add + This request + + + + Adds a parameter to the request. There are four types of parameters: + - GetOrPost: Either a QueryString value or encoded form value based on method + - HttpHeader: Adds the name/value pair to the HTTP request's Headers collection + - UrlSegment: Inserted into URL if there is a matching url token e.g. {AccountId} + - RequestBody: Used by AddBody() (not recommended to use directly) + + Name of the parameter + Value of the parameter + Content-Type of the parameter + The type of parameter to add + This request + + + + Shortcut to AddParameter(name, value, HttpHeader) overload + + Name of the header to add + Value of the header to add + + + + + Shortcut to AddParameter(name, value, Cookie) overload + + Name of the cookie to add + Value of the cookie to add + + + + + Shortcut to AddParameter(name, value, UrlSegment) overload + + Name of the segment to add + Value of the segment to add + + + + + Shortcut to AddParameter(name, value, UrlSegment) overload + + Name of the segment to add + Value of the segment to add + + + + + Shortcut to AddParameter(name, value, QueryString) overload + + Name of the parameter to add + Value of the parameter to add + + + + + Internal Method so that RestClient can increase the number of attempts + + + + + Always send a multipart/form-data request - even when no Files are present. + + + + + Serializer to use when writing JSON request bodies. Used if RequestFormat is Json. + By default the included JsonSerializer is used (currently using JSON.NET default serialization). + + + + + Serializer to use when writing XML request bodies. Used if RequestFormat is Xml. + By default the included XmlSerializer is used. + + + + + Set this to write response to Stream rather than reading into memory. + + + + + Determine whether or not the "default credentials" (e.g. the user account under which the current process is running) + will be sent along to the server. The default is false. + + + + + Container of all HTTP parameters to be passed with the request. + See AddParameter() for explanation of the types of parameters that can be passed + + + + + Container of all the files to be uploaded with the request. + + + + + Determines what HTTP method to use for this request. Supported methods: GET, POST, PUT, DELETE, HEAD, OPTIONS + Default is GET + + + + + The Resource URL to make the request against. + Tokens are substituted with UrlSegment parameters and match by name. + Should not include the scheme or domain. Do not include leading slash. + Combined with RestClient.BaseUrl to assemble final URL: + {BaseUrl}/{Resource} (BaseUrl is scheme + domain, e.g. http://example.com) + + + // example for url token replacement + request.Resource = "Products/{ProductId}"; + request.AddParameter("ProductId", 123, ParameterType.UrlSegment); + + + + + Determines how to serialize the request body. + By default Xml is used. + + + + + Used by the default deserializers to determine where to start deserializing from. + Can be used to skip container or root elements that do not have corresponding deserialzation targets. + + + + + A function to run prior to deserializing starting (e.g. change settings if error encountered) + + + + + Used by the default deserializers to explicitly set which date format string to use when parsing dates. + + + + + Used by XmlDeserializer. If not specified, XmlDeserializer will flatten response by removing namespaces from element names. + + + + + In general you would not need to set this directly. Used by the NtlmAuthenticator. + + + + + Gets or sets a user-defined state object that contains information about a request and which can be later + retrieved when the request completes. + + + + + Timeout in milliseconds to be used for the request. This timeout value overrides a timeout set on the RestClient. + + + + + The number of milliseconds before the writing or reading times out. This timeout value overrides a timeout set on the RestClient. + + + + + How many attempts were made to send this Request? + + + This Number is incremented each time the RestClient sends the request. + Useful when using Asynchronous Execution with Callbacks + + + + + Always send a multipart/form-data request - even when no Files are present. + + + + + An alternative to RequestBody, for when the caller already has the byte array. + + + + + Container for HTTP file + + + + + The length of data to be sent + + + + + Provides raw data for file + + + + + Name of the file to use when uploading + + + + + MIME content type of file + + + + + Name of the parameter + + + + + Representation of an HTTP cookie + + + + + Comment of the cookie + + + + + Comment of the cookie + + + + + Indicates whether the cookie should be discarded at the end of the session + + + + + Domain of the cookie + + + + + Indicates whether the cookie is expired + + + + + Date and time that the cookie expires + + + + + Indicates that this cookie should only be accessed by the server + + + + + Name of the cookie + + + + + Path of the cookie + + + + + Port of the cookie + + + + + Indicates that the cookie should only be sent over secure channels + + + + + Date and time the cookie was created + + + + + Value of the cookie + + + + + Version of the cookie + + + + + Client to translate RestRequests into Http requests and process response result + + + + + Executes a GET-style request and callback asynchronously, authenticating if needed + + Request to be executed + Callback function to be executed upon completion providing access to the async handle. + The HTTP method to execute + + + + Executes a POST-style request and callback asynchronously, authenticating if needed + + Request to be executed + Callback function to be executed upon completion providing access to the async handle. + The HTTP method to execute + + + + Executes a GET-style request and callback asynchronously, authenticating if needed + + Target deserialization type + Request to be executed + Callback function to be executed upon completion + The HTTP method to execute + + + + Executes a GET-style request and callback asynchronously, authenticating if needed + + Target deserialization type + Request to be executed + Callback function to be executed upon completion + The HTTP method to execute + + + + X509CertificateCollection to be sent with request + + + + + Default constructor that registers default content handlers + + + + + Sets the BaseUrl property for requests made by this client instance + + + + + + Sets the BaseUrl property for requests made by this client instance + + + + + + Registers a content handler to process response content + + MIME content type of the response content + Deserializer to use to process content + + + + Remove a content handler for the specified MIME content type + + MIME content type to remove + + + + Remove all content handlers + + + + + Retrieve the handler for the specified MIME content type + + MIME content type to retrieve + IDeserializer instance + + + + Assembles URL to call based on parameters, method and resource + + RestRequest to execute + Assembled System.Uri + + + + Executes the specified request and downloads the response data + + Request to execute + Response data + + + + Executes the request and returns a response, authenticating if needed + + Request to be executed + RestResponse + + + + Executes the specified request and deserializes the response content using the appropriate content handler + + Target deserialization type + Request to execute + RestResponse[[T]] with deserialized data in Data property + + + + Executes the request and callback asynchronously, authenticating if needed + + Request to be executed + Callback function to be executed upon completion providing access to the async handle. + + + + Executes a GET-style request and callback asynchronously, authenticating if needed + + Request to be executed + Callback function to be executed upon completion providing access to the async handle. + The HTTP method to execute + + + + Executes a POST-style request and callback asynchronously, authenticating if needed + + Request to be executed + Callback function to be executed upon completion providing access to the async handle. + The HTTP method to execute + + + + Executes the request and callback asynchronously, authenticating if needed + + Target deserialization type + Request to be executed + Callback function to be executed upon completion + + + + Executes a GET-style request and callback asynchronously, authenticating if needed + + Target deserialization type + Request to be executed + Callback function to be executed upon completion + The HTTP method to execute + + + + Executes a POST-style request and callback asynchronously, authenticating if needed + + Target deserialization type + Request to be executed + Callback function to be executed upon completion + The HTTP method to execute + + + + Maximum number of redirects to follow if FollowRedirects is true + + + + + X509CertificateCollection to be sent with request + + + + + Proxy to use for requests made by this client instance. + Passed on to underlying WebRequest if set. + + + + + The cache policy to use for requests initiated by this client instance. + + + + + Default is true. Determine whether or not requests that result in + HTTP status codes of 3xx should follow returned redirect + + + + + The CookieContainer used for requests made by this client instance + + + + + UserAgent to use for requests made by this client instance + + + + + Timeout in milliseconds to use for requests made by this client instance + + + + + The number of milliseconds before the writing or reading times out. + + + + + Whether to invoke async callbacks using the SynchronizationContext.Current captured when invoked + + + + + Authenticator to use for requests made by this client instance + + + + + Combined with Request.Resource to construct URL for request + Should include scheme and domain without trailing slash. + + + client.BaseUrl = new Uri("http://example.com"); + + + + + Parameters included with every request made with this instance of RestClient + If specified in both client and request, the request wins + + + + + Parameter container for REST requests + + + + + Return a human-readable representation of this parameter + + String + + + + Name of the parameter + + + + + Value of the parameter + + + + + Type of the parameter + + + + + MIME content type of the parameter + + + + + Convert a to a instance. + + The response status. + + responseStatus + + + + Allows control how class and property names and values are deserialized by XmlAttributeDeserializer + + + + + The name to use for the serialized element + + + + + Sets if the property to Deserialize is an Attribute or Element (Default: false) + + + + + A class to encapsulate OAuth authentication flow. + + + + + + Generates a instance to pass to an + for the purpose of requesting an + unauthorized request token. + + The HTTP method for the intended request + + + + + + Generates a instance to pass to an + for the purpose of requesting an + unauthorized request token. + + The HTTP method for the intended request + Any existing, non-OAuth query parameters desired in the request + + + + + + Generates a instance to pass to an + for the purpose of exchanging a request token + for an access token authorized by the user at the Service Provider site. + + The HTTP method for the intended request + + + + + Generates a instance to pass to an + for the purpose of exchanging a request token + for an access token authorized by the user at the Service Provider site. + + The HTTP method for the intended request + + Any existing, non-OAuth query parameters desired in the request + + + + Generates a instance to pass to an + for the purpose of exchanging user credentials + for an access token authorized by the user at the Service Provider site. + + The HTTP method for the intended request + + Any existing, non-OAuth query parameters desired in the request + + + + + + + + + + + + + HttpWebRequest wrapper + + + HttpWebRequest wrapper (sync methods) + + + HttpWebRequest wrapper (async methods) + + + + + Creates an IHttp + + + + + + Default constructor + + + + + Execute a POST request + + + + + Execute a PUT request + + + + + Execute a GET request + + + + + Execute a HEAD request + + + + + Execute an OPTIONS request + + + + + Execute a DELETE request + + + + + Execute a PATCH request + + + + + Execute a MERGE request + + + + + Execute a GET-style request with the specified HTTP Method. + + The HTTP method to execute. + + + + + Execute a POST-style request with the specified HTTP Method. + + The HTTP method to execute. + + + + + Execute an async POST-style request with the specified HTTP Method. + + + The HTTP method to execute. + + + + + Execute an async GET-style request with the specified HTTP Method. + + + The HTTP method to execute. + + + + + True if this HTTP request has any HTTP parameters + + + + + True if this HTTP request has any HTTP cookies + + + + + True if a request body has been specified + + + + + True if files have been set to be uploaded + + + + + Always send a multipart/form-data request - even when no Files are present. + + + + + UserAgent to be sent with request + + + + + Timeout in milliseconds to be used for the request + + + + + The number of milliseconds before the writing or reading times out. + + + + + System.Net.ICredentials to be sent with request + + + + + The System.Net.CookieContainer to be used for the request + + + + + The method to use to write the response instead of reading into RawBytes + + + + + Collection of files to be sent with request + + + + + Whether or not HTTP 3xx response redirects should be automatically followed + + + + + Whether or not to use pipelined connections + + + + + X509CertificateCollection to be sent with request + + + + + Maximum number of automatic redirects to follow if FollowRedirects is true + + + + + Determine whether or not the "default credentials" (e.g. the user account under which the current process is running) + will be sent along to the server. + + + + + HTTP headers to be sent with request + + + + + HTTP parameters (QueryString or Form values) to be sent with request + + + + + HTTP cookies to be sent with request + + + + + Request body to be sent with request + + + + + Content type of the request body. + + + + + An alternative to RequestBody, for when the caller already has the byte array. + + + + + URL to call for this request + + + + + Flag to send authorisation header with the HttpWebRequest + + + + + Proxy info to be sent with request + + + + + Caching policy for requests created with this wrapper. + + + + + Representation of an HTTP header + + + + + Name of the header + + + + + Value of the header + + + + + Tries to Authenticate with the credentials of the currently logged in user, or impersonate a user + + + + + Authenticate with the credentials of the currently logged in user + + + + + Authenticate by impersonation + + + + + + + Authenticate by impersonation, using an existing ICredentials instance + + + + + + JSON WEB TOKEN (JWT) Authenticator class. + https://tools.ietf.org/html/draft-ietf-oauth-json-web-token + + + + + Reflection extensions + + + + + Retrieve an attribute from a member (property) + + Type of attribute to retrieve + Member to retrieve attribute from + + + + + Retrieve an attribute from a type + + Type of attribute to retrieve + Type to retrieve attribute from + + + + + Checks a type to see if it derives from a raw generic (e.g. List[[]]) + + + + + + + + Find a value from a System.Enum by trying several possible variants + of the string value of the enum. + + Type of enum + Value for which to search + The culture used to calculate the name variants + + + + + Executes the request and callback asynchronously, authenticating if needed + + The IRestClient this method extends + Request to be executed + Callback function to be executed upon completion + + + + Executes the request and callback asynchronously, authenticating if needed + + The IRestClient this method extends + Target deserialization type + Request to be executed + Callback function to be executed upon completion providing access to the async handle + + + + Add a parameter to use on every request made with this client instance + + The IRestClient instance + Parameter to add + + + + + Removes a parameter from the default parameters that are used on every request made with this client instance + + The IRestClient instance + The name of the parameter that needs to be removed + + + + + Adds a HTTP parameter (QueryString for GET, DELETE, OPTIONS and HEAD; Encoded form for POST and PUT) + Used on every request made by this client instance + + The IRestClient instance + Name of the parameter + Value of the parameter + This request + + + + Adds a parameter to the request. There are four types of parameters: + - GetOrPost: Either a QueryString value or encoded form value based on method + - HttpHeader: Adds the name/value pair to the HTTP request's Headers collection + - UrlSegment: Inserted into URL if there is a matching url token e.g. {AccountId} + - RequestBody: Used by AddBody() (not recommended to use directly) + + The IRestClient instance + Name of the parameter + Value of the parameter + The type of parameter to add + This request + + + + Shortcut to AddDefaultParameter(name, value, HttpHeader) overload + + The IRestClient instance + Name of the header to add + Value of the header to add + + + + + Shortcut to AddDefaultParameter(name, value, UrlSegment) overload + + The IRestClient instance + Name of the segment to add + Value of the segment to add + + + + + Extension method overload! + + + + + Save a byte array to a file + + Bytes to save + Full path to save file to + + + + Read a stream into a byte array + + Stream to read + byte[] + + + + Copies bytes from one stream to another + + The input stream. + The output stream. + + + + Converts a byte array to a string, using its byte order mark to convert it to the right encoding. + http://www.shrinkrays.net/code-snippets/csharp/an-extension-method-for-converting-a-byte-array-to-a-string.aspx + + An array of bytes to convert + The byte as a string. + + + + Helper methods for validating required values + + + + + Require a parameter to not be null + + Name of the parameter + Value of the parameter + + + + Default XML Serializer + + + + + Default constructor, does not specify namespace + + + + + Specify the namespaced to be used when serializing + + XML namespace + + + + Serialize the object as XML + + Object to serialize + XML as string + + + + Determines if a given object is numeric in any way + (can be integer, double, null, etc). + + + + + Name of the root element to use when serializing + + + + + XML namespace to use when serializing + + + + + Format string to use when serializing dates + + + + + Content type for serialized content + + + + + Comment of the cookie + + + + + Comment of the cookie + + + + + Indicates whether the cookie should be discarded at the end of the session + + + + + Domain of the cookie + + + + + Indicates whether the cookie is expired + + + + + Date and time that the cookie expires + + + + + Indicates that this cookie should only be accessed by the server + + + + + Name of the cookie + + + + + Path of the cookie + + + + + Port of the cookie + + + + + Indicates that the cookie should only be sent over secure channels + + + + + Date and time the cookie was created + + + + + Value of the cookie + + + + + Version of the cookie + + + + + Base class for OAuth 2 Authenticators. + + + Since there are many ways to authenticate in OAuth2, + this is used as a base class to differentiate between + other authenticators. + + Any other OAuth2 authenticators must derive from this + abstract class. + + + + + Access token to be used when authenticating. + + + + + Initializes a new instance of the class. + + + The access token. + + + + + Gets the access token. + + + + + The OAuth 2 authenticator using URI query parameter. + + + Based on http://tools.ietf.org/html/draft-ietf-oauth-v2-10#section-5.1.2 + + + + + Initializes a new instance of the class. + + + The access token. + + + + + The OAuth 2 authenticator using the authorization request header field. + + + Based on http://tools.ietf.org/html/draft-ietf-oauth-v2-10#section-5.1.1 + + + + + Stores the Authorization header value as "[tokenType] accessToken". used for performance. + + + + + Initializes a new instance of the class. + + + The access token. + + + + + Initializes a new instance of the class. + + + The access token. + + + The token type. + + + + + Represents the json array. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The capacity of the json array. + + + + The json representation of the array. + + The json representation of the array. + + + + Represents the json object. + + + + + The internal member dictionary. + + + + + Initializes a new instance of . + + + + + Initializes a new instance of . + + The implementation to use when comparing keys, or null to use the default for the type of the key. + + + + Adds the specified key. + + The key. + The value. + + + + Determines whether the specified key contains key. + + The key. + + true if the specified key contains key; otherwise, false. + + + + + Removes the specified key. + + The key. + + + + + Tries the get value. + + The key. + The value. + + + + + Adds the specified item. + + The item. + + + + Clears this instance. + + + + + Determines whether [contains] [the specified item]. + + The item. + + true if [contains] [the specified item]; otherwise, false. + + + + + Copies to. + + The array. + Index of the array. + + + + Removes the specified item. + + The item. + + + + + Gets the enumerator. + + + + + + Returns an enumerator that iterates through a collection. + + + An object that can be used to iterate through the collection. + + + + + Returns a json that represents the current . + + + A json that represents the current . + + + + + Gets the at the specified index. + + + + + + Gets the keys. + + The keys. + + + + Gets the values. + + The values. + + + + Gets or sets the with the specified key. + + + + + + Gets the count. + + The count. + + + + Gets a value indicating whether this instance is read only. + + + true if this instance is read only; otherwise, false. + + + + + This class encodes and decodes JSON strings. + Spec. details, see http://www.json.org/ + + JSON uses Arrays and Objects. These correspond here to the datatypes JsonArray(IList<object>) and JsonObject(IDictionary<string,object>). + All numbers are parsed to doubles. + + + + + Parses the string json into a value + + A JSON string. + An IList<object>, a IDictionary<string,object>, a double, a string, null, true, or false + + + + Try parsing the json string into a value. + + + A JSON string. + + + The object. + + + Returns true if successfull otherwise false. + + + + + Converts a IDictionary<string,object> / IList<object> object into a JSON string + + A IDictionary<string,object> / IList<object> + Serializer strategy to use + A JSON encoded string, or null if object 'json' is not serializable + + + + Determines if a given object is numeric in any way + (can be integer, double, null, etc). + + + + + Allows control how class and property names and values are serialized by XmlSerializer + Currently not supported with the JsonSerializer + When specified at the property level the class-level specification is overridden + + + + + Called by the attribute when NameStyle is speficied + + The string to transform + String + + + + The name to use for the serialized element + + + + + Sets the value to be serialized as an Attribute instead of an Element + + + + + The culture to use when serializing + + + + + Transforms the casing of the name based on the selected value. + + + + + The order to serialize the element. Default is int.MaxValue. + + + + + Options for transforming casing of element names + + + + + Decodes an HTML-encoded string and returns the decoded string. + + The HTML string to decode. + The decoded text. + + + + Decodes an HTML-encoded string and sends the resulting output to a TextWriter output stream. + + The HTML string to decode + The TextWriter output stream containing the decoded string. + + + + HTML-encodes a string and sends the resulting output to a TextWriter output stream. + + The string to encode. + The TextWriter output stream containing the encoded string. + + + + All text parameters are UTF-8 encoded (per section 5.1). + + + + + + Generates a random 16-byte lowercase alphanumeric string. + + + + + + + Generates a timestamp based on the current elapsed seconds since '01/01/1970 0000 GMT" + + + + + + + Generates a timestamp based on the elapsed seconds of a given time since '01/01/1970 0000 GMT" + + + A specified point in time. + + + + + The set of characters that are unreserved in RFC 2396 but are NOT unreserved in RFC 3986. + + + + + + URL encodes a string based on section 5.1 of the OAuth spec. + Namely, percent encoding with [RFC3986], avoiding unreserved characters, + upper-casing hexadecimal characters, and UTF-8 encoding for text value pairs. + + The value to escape. + The escaped value. + + The method is supposed to take on + RFC 3986 behavior if certain elements are present in a .config file. Even if this + actually worked (which in my experiments it doesn't), we can't rely on every + host actually having this configuration element present. + + + + + + + URL encodes a string based on section 5.1 of the OAuth spec. + Namely, percent encoding with [RFC3986], avoiding unreserved characters, + upper-casing hexadecimal characters, and UTF-8 encoding for text value pairs. + + + + + + + Sorts a collection of key-value pairs by name, and then value if equal, + concatenating them into a single string. This string should be encoded + prior to, or after normalization is run. + + + + + + + + Sorts a by name, and then value if equal. + + A collection of parameters to sort + A sorted parameter collection + + + + Creates a request URL suitable for making OAuth requests. + Resulting URLs must exclude port 80 or port 443 when accompanied by HTTP and HTTPS, respectively. + Resulting URLs must be lower case. + + + The original request URL + + + + + Creates a request elements concatentation value to send with a request. + This is also known as the signature base. + + + + The request's HTTP method type + The request URL + The request's parameters + A signature base string + + + + Creates a signature value given a signature base and the consumer secret. + This method is used when the token secret is currently unknown. + + + The hashing method + The signature base + The consumer key + + + + + Creates a signature value given a signature base and the consumer secret. + This method is used when the token secret is currently unknown. + + + The hashing method + The treatment to use on a signature value + The signature base + The consumer key + + + + + Creates a signature value given a signature base and the consumer secret and a known token secret. + + + The hashing method + The signature base + The consumer secret + The token secret + + + + + Creates a signature value given a signature base and the consumer secret and a known token secret. + + + The hashing method + The treatment to use on a signature value + The signature base + The consumer secret + The token secret + + + + + Types of parameters that can be added to requests + + + + + Data formats + + + + + HTTP method to use when making requests + + + + + Format strings for commonly-used date formats + + + + + .NET format string for ISO 8601 date format + + + + + .NET format string for roundtrip date format + + + + + Status for responses (surprised?) + + + + + Wrapper for System.Xml.Serialization.XmlSerializer. + + + + + Uses Uri.EscapeDataString() based on recommendations on MSDN + http://blogs.msdn.com/b/yangxind/archive/2006/11/09/don-t-use-net-system-uri-unescapedatastring-in-url-decoding.aspx + + + + + Check that a string is not null or empty + + String to check + bool + + + + Remove underscores from a string + + String to process + string + + + + Parses most common JSON date formats + + JSON value to parse + + DateTime + + + + Remove leading and trailing " from a string + + String to parse + String + + + + Checks a string to see if it matches a regex + + String to check + Pattern to match + bool + + + + Converts a string to pascal case + + String to convert + + string + + + + Converts a string to pascal case with the option to remove underscores + + String to convert + Option to remove underscores + + + + + + Converts a string to camel case + + String to convert + + String + + + + Convert the first letter of a string to lower case + + String to convert + string + + + + Checks to see if a string is all uppper case + + String to check + bool + + + + Add underscores to a pascal-cased string + + String to convert + string + + + + Add dashes to a pascal-cased string + + String to convert + string + + + + Add an undescore prefix to a pascasl-cased string + + + + + + + Add spaces to a pascal-cased string + + String to convert + string + + + + Return possible variants of a name for name matching. + + String to convert + The culture to use for conversion + IEnumerable<string> + + + diff --git a/dll/AipSdk.dll b/dll/AipSdk.dll new file mode 100644 index 0000000000000000000000000000000000000000..cc4377bf4ab514e10f325eb1aa01c6b87ce79d1b GIT binary patch literal 53760 zcmeHw3w+#FmH+wu<~>O!Gm}?eX(pwCAx+XJrG-+OCTSaJ`bt__D5jHSnhc#}(%(!< zA5c?)Dnga2fG!Wq%T)vwL2*}HKoQXu1zlA34+sh??xMi1?6QjR|DJPyznR}8eNod| zKcAg8=XcM!=iYnnx#ynyoZqxvcpW*2$cexA-Xr=3p8Q!P@bF+5(SfRe4A29v9kBi0}3jtvZ?GLf!$#26ZgBnBeQE88Resh)U4QIUVDnf0m`qUD-{ z?&_W%$lbv5M% zCZ7n=rUoNzbOTeep>A#IFLlN#;Dw*M;wWbt$G|btiO8_rN4o(%UF{UGxaSlMLl%qTnRmMSN;?#}v5p_9~ z=G4nChoL+5XgNosshzbe^eFh* z>$^CG(T)<_(Q(M3mS`e)!(c?=A&0(;3r>wklp``@h$uAyL46m?pPGoEe_C~zqOdD} zfg@FkM_7xZBz{!kk&1AbqSbiR|Llc8nBFZ%9VVuxfbbkt>1XM8akUD)bv|!J!?t-h zLQs7d*L`;M`8Bv0(Yt&n5W$Hu|x_D zqkd?3v=vL^cSmQTXgviJcGtU}e+aR96ul2Jp-Z{T%cG~^QQ(<>oy4%5g<;)eJj)g` zo28xuP_ZEyJ%bUhg2#B>icHPr$bI0`YRao3x1`QwCKNwycQ;BG+wMZ(UH4;1n4XW= znqiJforPdsm0s~~$>lH&CrV_iQYD_vnLvwfiH3zaU+}o23qXCY*0j$e`u2|r9i8ZN z`nx5&n5SN^sO2zcR~HhE>rr?kck~>jtSyJixl6O5u@69Y@TSm{BN_n}idqP^A?Qgf zc%eLXE)e5S5Xl`~grGRQou2vvL(^!`#A>;(@F)@}r*gEJcDGf2eTl=a8*+^HtunMx71 zq|lpc2I>`|)99$~ot{(+D3K?SQA4#tjHQrV1+SflgwZA7Fu9=RZ4@x*BaNeNUbQ{A%aEELlA8%-45kU zL?5q#=k#$oXnuc<@i0;t&j5(esxkhApl*hXb<3CejcEuQX9Kup_=uj5)CI0Ow@1qG zxlfq?ARSgwB<4+(f zT=grSXcQUmfvTqz7&Zm+5E++H)z zdwb3Jkn{HF2JrD*%So@HtqRa4sxL&o;slD>2j=De5^vaRv?43%8ikY042=(ig!~-H z&$vy(Nwhh2$nl3< zGMBI=aQlqAP;y9l(h`rU6*w=y@gyR=sR)90>aUsIBjj548yJFk-W*C}p5*uI1?7d) zCVIU4i`-#{@g8`iouH>S0i5csSYPPH{9@KG-Qq55Kah@rUSqhN=ujAo{HG4XD>&h2 zd6q*2Zwx=1?nX?3Ck2n?_rKuxpwpXkIBRyI=0#reg}7TNe})#6kDh`f^Vhp&vR13_ z?zb#2iNL$=r`ht9Epv?6>F$Aio}Vy}vQCb%{GfyGLeOuf1b0=9utL%GU^s}P&)xCfd+(XLX1_fJ@&?#O;RDd9rvv)a=a(JLQ$yIANeXAPDMp|d3iboG&%^t^Y^WIUQ&B1 zPa-iix@$K((r`-d8e=vpEsK+y3R#@g%G}`$c!d!D>rognRwu?etQ*uE6Fy^UHf*fr zAm&XN>tw<&an6*1(oDjQ;BZMF6l%a(*Bo%B(qJgS%0r805Gqu>VLdto43BMi2s;=q zMOaoI+PgdjF;^aD?zbWL)OO}5w^8&c=3#ET6ki<0$CQekTxRNTg6jBKVif&5Oph+L z#4@>`2GyMMaE&pE!MsA|`Km8nObyqlH3rXl=8n|q^GL3A>ayw7X}pr9+w>c7L2<4z zQyiD=uxp45&1*PrWtW|UTQcArrJAvBf2xtQ3@V+T$Hol9SCeRX5NGWy)f&9! z;d!Q$u0Wr`7;@0Hg8sr5`xLgqTqvle%#oG|f5E(dV3(TLPj;l>7G$AR#=`S*UjkV5 zlv@M|fKXu(BmlxViy#3IFo{%oNT62d<%GNZUF~39UF}1_p|D;0N8088prMsr8k!5i zR%GON)-|2@Zrh0BRrfA4yWIJp80}29`Irq^Hp>ezWpwY3fokioW|j$1Rad|&{(No` z%g;usVO_5Oz6e_i!F8;)WT?T#m!Qg1GB#abYVidKoid3h#cQ zA-B@=Mi+ssCeQA2RiY{7OtA7a-|aTneDmqjuc$Sj3>w_e)bO#KL+9znEhyJqpwuu) zZ0SR&w~QMO<9@^|D^g>K@h}tGzBdiToVxKc5T7i@rToaN4x%V5#XoN= zW>&Wcob{eG9G^ev3^(nZ%H zS8JMLvm!P+XWdGtSa1p>i2u~1^L&T3){%C39yM&w`4%L#WIe#5O@V0U+{?(xdelDn zu#%W=FE<0oiDu3(^ZU$U^tc=LZ~bhdihNv6}o_|DxqS;wY}A6bw2zVnV; zdykqAeKk7<9k=!#F{+u;hkY1g>i|+bPGr57nlI(s!O1KCyrYu;Fn-Kfj2zV1b)xj2 zRkbs}cQfWV`44h{MVE_DL?^ zg$22`J{k3Q4D#{5!kDc&e`Nd!8XD$lvaz5LAs*z7103R^$tW#Ch$nx>l^o)!Rqf{v zwKZE~yb7l1l@Rc9Y-%~p{hN_%+BcX9JIQ0b&R!Kb$~EmY^f#QMTYJaGMkG}7nB&hu za^m$`wjY@L1rKG@x$2sZZs+r8`sRdUs~)B}xGiMve2(m=xwSgWH&V}Yk?uI?`9M~_ zoH*uqkuT3kechdvXH4}~8XTdoDIlnw;+%kL?vRs@_clh_!3?C!vjg5|9I;En>9DPp zXFs1fbUL#I|Hu;MHl}l8$(j5}Ih>)RlVfDMO-GULV0QAeY`QU>gC0bC*1lz~9c1qg zCn&t9$+B&-#zM1?ofU>IaDL+UJL;MoM|HYz*gj^d{$TciP5Hcb{d~4;vl&ZEU=OMp z?Gsa$`yWQgJprsr?tmNTBJRIja#MznvJCdU$ywQWSb3QMhejj65JG|OV_!w;30fK_l3(o=z zq{gO^b0%;0!+L7CDAx~j?fJ$@sjr-T`zuby_RPsQZ`{c!U(Vig^8K~!O?=%o2lI8m zWZhkR^7^{f<4xxW0( zgUYMUrN+iBn{~JCm)K_%)|@GSza-a}bMpPQ`f~nUVBy4rweMeBU%B>t;3St1Uqd;` z{NE==@5QLQGc|HgQEkI~j4vYH2)B)A`T(BMn@r>`Ms5M%Z$sb$uDYNj0T9+&1PL7R z%=%u|&Zm*tNpWWFq>sa|;n*H`OO4`6h&F{QZLTXTnP8WdIdEm>6!6HYgKW7oF?AId zBsgH7h=;lnh%YGEZUo{+9p4D7!b1{bYpxn$>qej>dm}JA!&5%(d}`RC=65pQa`Rvf z%xjcx$SwO*4&(BXa_<`{cW^S#MtM1Ex|k^-n0pO2Y6Ga|El2y(Rmxjpm1pW^E_m~F z!&%zay=Fn2rLCZB^^hlSyjXcUjIVQcqI;+DL^f=e^%N8A?ZEXxgRQCpeX7+MW{I5I zX|HPsxLiW8O6Rh171`3?Vap!iGTwjLR#8&VZ=$SnWn;O$dwV@`V~O z1!ny?2ammeq73A41Z@Od(YVh&|%Vy80RZ%tawRg%YCP;%EK`)~Wffc1{WveFkJXi&X(N0$U zBkJI$tY~Hd2h~BI?d9}%5ED2|er5sE_9L49Hok-c-N6E&y;ls zaaV zDxG%P_z_h3;;ckjXJ22%mwofD+?%rPhiqyL$Cvl=@4GLcH6K%BE`OJ2ey*)X-D&%K z)(tA1ZL7+foX>N*qF+}{4!_}~g}Ho2wfU%gMzwh^GtLX&s<7;5#GJ*L1_?%eCqhm3 z{Kb0o!_XjfsoLij@H(#z^4xQbEicN&7023!^iy0G4n>`{o6SU)0ytAuPqfeC z_VX5N=9>o!fp44DFr(p&8E4Mo0UY0^MGkZTlh{*s<2y^3KP?)EaC^o`4D_a%V>ukl zA8^`x%G!2X1cksv=#-^vTbuD*1^f++$EPe#^4GNFqoapjPC5#3wFG}N3P@?RNt)9D2a zOa1>9DyBP;)J+Tgy~S?&tiWM`!2+f{C*ijQ#sxkj zx!m+x!57Q@6fCL__-R+!HKj}Gfe@GSn8fx3>H`7#mc}rkbE;u4=WvI&9ZaQ24MunT^1Q;$Y;Mm`agntM!r8~qDdMh44 zSrbDKfPbs&i2`n$c9;OS9sWgv^rPb5;CzLlO{bOj1{+C7i|zpy@-YVeB0fm}RmfNv z-y&x0suIRZaOTR`J7LC3sa~+xLvfgDDZXRKaT9&`B49hr zxNRu?EE*PUxNuwHGGHGvpfcvEN)arX*#U5K&u^cBG-`fdsZX#?ifT!%M{Ic@_zKsq{& zjs@bybP?u&j%w%=-Kvp3089txTlnH!BgN=pTU-}?n;ckpwxBH=DNc{u;x^;OD!E*e z^kbCwC)Z_@-SlM12La#oei-nTf@=UTEcrO#X3vd)Kb3H>=lrg0P;c{9J{&IR1 zoaNLf;hzY-&c!)ARKV~YDdmTdXZ5gW9K(#0;SEyay~49cVn0*C^k)PP2%HmS%6-Ul z_3#}67oqgk!#7Hvah=2W3%pw3R)OCZ_-TQklCr)e@b87PQQ+kQ4+#Bx0{;Q9WB4`b zuw!_+z^B2}G5ntb%Z1V`JQoRkM<|sNeoVq?fqw_6(E<0j03UQe3SGrPSvP!^z>k1` z-S7+0)wkr13w8rNTpX=((anPGkv!e>XT=FDh%q5l zP5A8fezB~f%0uG?+v9ztY&Ni|X57ma9h#R`DU4dn=T~`Yc#5Q>kCrW}^3iK1_DtE5 zDnBj9$c#Mc-;rk_-6`0WC~qIWU;J~0dG`l8v;h6m#BK@%F=2hx#9k_SSTCkGOzih1 zZB@nezk==cRzVi%f(K`GcFaUEt{TXB0;3Eg92ePtI`mD0~m&d-;|s>{~FIsdv?wJu?N#7_MsH&iknV4RZsTxmDnAp34-BlCl4}v|WHNh`WqEm4zjYzdv zCCw1*2D&Tok*Z3{;GP=Mer(9>uc{_*En_#(^JOUa%YRx}ZCNecHrI3h$|k(mN*hg6Hd1r_()ks)RH3hpML0b0+rB;YX|L zXhFS-`(W_1wXBtK`%FOE_-Qj!LO?3 z(7YLfNxJ!TzF=2+pL2C+XVZGY9wTnCv*~RU<90ZkXr`p|-iiLOfV?L5RrH4i6f&`; zg&o>CG~UEIpzCvJiixFRkqfET#CF0W7t(AKd#(Id{aiZR#QspO(Ye%YV$V6JIu_A# z6MMz^1AP&#HL)!vpTsz%T2r+{W1e0bX_Ig&y)@BfDjoeQ{AN`%-8qYEbS1SF|G8=j z9hfck6TK|WOV>(w+v3in2LyYJ*p`;l6Dp2wD|SZOsBezsLccE!MOM<=CU#jtWn?wI zcZQ1d2P-3MDLPkSHy2e#HsqClv03^aY0XaRFge{QVH1(e(f5+OI27rkn@wz@%NgmR zW%E>?6J4RmW_sDgp7A*&eRLf!RAB|_0rtNRnR7Vxhq>4zrPSTZwm4LO@tp0|~r8M&73G_j{bp~%N+PK$~w7BQ((rN>_fe$# z2SO*nXD{7}bl;>$Ol$(ueTz1&P;vi`bPwlA_Gq4D-=Q}Yr|9J|ddEz+s?-^IoNivJ za_Iy11T9#luxnA?59m1)+wR&P`5|4qTE+bV7WreUTcfbYQTo&LkcnM{Tz*O$+g02L zfjvX-n3w_V=cb%$gngE7?qE)3XaA2L6-;^I=jauMdG`hPMqZ%b3AV?3WAGYa|82%K zg!V^%N$;9*XNGP7=3T2wZ$Wu4(gP;;)xw)2zoJd+Bu+H(G9?v8T_yKM{*9h9vDT8W zMSe>&E>O8F3OyA054y+1mW7^({5~(2H)z~?#W@)IY2-iYMH5>aoEiBanz}*7-R=8T zY_Z(fc6a=XHc{IB{g6^hd z^;GSXCN@ReR$ZgrCK%g9kWSOSqA>4wi#oKZ_6-wzvM5MV?NPy038&|kaJu%S#9cuj zrdJ)OYyWCu^|Y4fLKL2P{!d00}LmDuG3nHJ)?rdJ%ARc;vWrf3o=ind?XwvxqVV3 zxgYyO8vWiG4C+`_a5z@T&?+$)bkO4^!65c$g?^Ug#yRW4<1nTAy^~XAN|?@XQ`6{Q z5!UGDa?bfDlJ-GKd$T}$EmW;J2c3#a`3;TF`nbe1B!}OKw6%Z^iFHb>%Z#<>qiQ-@ z4|a;3UzPiyNT|wE8XL`HrzrhQ_j0{dsxDV9tmsq2thWiGx6`B+@0V^bQORj9@tLBL zB`Qe{MYpH5hY!VnD7roE@d%Hu^;;FWn!Y7A|8evqo&HT@4Xaw)d9Ie&7j3c1>KN+u zN3r=F1^vs``lCy?D8Zm+mbFZ5oBNJV#pt09>Ot5^6VM}EGz6<~o1DM0S;em;m4a5D z+&fgu+9^k))o%rII(fhR_Ogzx^yyOf>k4xEx6AN;Wjnk)_MU4m<$m-ptM}P+xKMQ7 zR>rb@z{9P^VI5)Cwi~`qrQZh#Kj((G(V`t)R4g7?<;HXetpVLhOKq_uWmCD0mN}m?x_uQzdGCKj zxmFK)Mttl)O6jUkDS7M^rSo&8?)LCCA=bv5;=TVUqX2tsYixQ%yuCfv9#&~b!_hnz z#YYc^u)hiDrtyG&Ivp^G#W}I{b;#!q+M_Kj{Q}@A=w?ek@m->XM=xl(RJF@ zT3zX_+EzNl%c=fUa)?LSa%Omh|84|s*|8`_(6ZOK1rzokb!j|tBYwC`(g6+ERa zmz0Huu=Je_Q!lxklsi6+-bjfYJ zmUK)wAUBF8O$qy56}vK0B`(%5bz-yR}i2_Aa8&kqvrshpfd{t z^h3I*FicNUC-Q%aii-l+uf7cM7xWvz=V%>H@m{3w;(YBT;dz;66=P2q`%VG8Pjpf+ zKyT2kfPbJ!C_r!1BY^MF<}gp73rhmz)Gi0~YOetnY8RIVD5(7cuvELSEKFq@mpe}T zaan*SX^U|R8POgGoT{Bx5x`1iFJPVaC%_rnws8TPqrC|@Pg^rSO!Fn}0`0-^0a~Qh zO$ejiIJai)ixZ%8t$v~(o@M})<=Q@-KgC(DNGj&eUnyL z8AhMxe0sDUm1r;R_mzH1fHO?}pyPH3U>JUd!x^my;j4tQPvG?eZxMKxz3ZtX@SoQ zd`aMM1->cpe+6m|E~`>tjlg<=^942vY!$d#;0A#)fmaFK2k50+1m5Pj6yduh`~`%= z^sMl_DU>27YcJ$v{z`Y@(|G&!_!>?LxmuU^jhf%CO{iKww1UoT~*c5_p@yM+Lql zP}7+wBCuNEB7vI(4huXW@HT;u2z*rFivnK~NDj_N6BrR#EpU;*Ukg0N$vjO0y9Hh$ zaM;820|Flr_@Y4aifjTG3EU)bSl|JHd;H9Eo51Qq$)_kyznJofz(plY*(7jS-~oX& zPI4A_HZ8$B4QFeg*6!9`*8W}lU#(QXPyf08mR{%xIZk&hb!>L*aeUG77008FA3Ai* zNF11pIq}bje}4R{z}ZfO-}Oh&dOll?vzf9x0AH>6Jm7r+hW}Y|4`72(E);l1;eDXI z=;GL~ORDvS9NsPbZr&!1U&!S@khK-lkiI!4#>-IV|PLxC*IiWgq$wS zw>;DeInSr(@rx_ZV}AEM@E5et(jvW;F4VW;c^7>Q;g50g3l`4r?3~#-13RfPBOPBo z6gPILyFLrM%n0U~J&Rdd`(wTFbVmxTvHmnODEh+g&d%mUdN3K=(Ugp()3awYx1{4h zQ*0nLkm!yj*TlCD#nTx{XmQM%!=dI><4~qAWh8dSGKtgxbEpUrZ!WW}GE&{~bb47P zGib|aro=(w^HK>(W)?iNbLOF{ga{=X0tXk($)U=fNh^ku$yir1j=jm&mVu%E zxM5){jh?s>@5v*s0s&gcF#EDty01N+L1=j*&5uh{M$b&*U#mf01DV;gEFlp%xRA4G z$DpolI5{blg&hhv%RHpP1CY0r-hoFCc31tsijkeJ2~9m($TrLy+sP_ zT)SpD9g<<~s^-Rymc#QXafGLFMMrDrs+DV2bS`aOl1tUr*wM61(3OpAJ5(sgdME*w zu35Qu73)OFdU!TV2(H!PIhUH1Z_n{HL)lGG$>B61$qvDwBxR1}t?i@pS=X|rb;*WN z*|#>gKwW0Uish?1n^&w@-bU>^(wTUFL+eTs6?L?%S+jBtHMh1e>r`@r-rCl<+`^h* zIA+Ak#piK7Ol;M1WMCoNxHEKiid8npGBHZSJSEV>Sbw@ZWh4__FxGBMf~Hh58JBL8 zZde*0h#QG+l4mTrIF<$yALypFMzXQHd&oc!z95n5TaMp>>P`)8PV~0+P$rh%f(L#? zYN?SL8bq+yd>YE!FT5gCEONy{X2Y9%_&E$CquDP@+GPj2Rp>OKutHiw$(g zaj+XpH>U>TriTP!Ny_NQ!&IML`1ZkgcOsTd>_jy8%BG=254Lrs=i*rR7Tn@o zl87fkZNhJaji$C3M#?yNRCBy*s27qSB2ioVATdzdX!iDj(X@`#miR%)qR!FWYtwOK zG__^>V8VzuW=6*-m1g2S*3dCZ8?8OtM<;6>Ou)O2rnkqtjd8O5l2~_KwHjJR5^_5TCEF@O&SBif z?U`6+C@ri!INH#)Mxte)oAW@?7sR_{{1)45jwj=p_~IRkqO5QPP1$2UF~Ji65vUDA zF^Buj=c+`Ua-$u!@^m1T=HZYM1A{}Ew%FjHm>vkJp$sTX5(u`Y*QJse@)2xG4Wv_e z4xmd&5$)Z5aRgz!@s0!n9jUbgiEVKs9ZL#+fsx3>mnR0|6qByov18Cu-#{ilkP)2K zkDRmk;#AKLiO4Yb1$`K$bNvWmv_pH`*p}#yqvMO-*2Vi0-ANSG9UoAXRgl<@Hyep< zsGE&r@lYCarPCIP+Xebx6Ngebla5R}8(tdEWW!C#6k?U`;v_RNZn_S5m$ifNULp`< zP4FVX8hd+**C6peW7!$ajq3+D+h^Exw4kOXqchIQ*!Pvl#T$(jQ0~r`0 zmx*$^63Ily7Q1){w8(u?CSnqT(^g1_u>(!4!ZI{rAm~qRi{sIq>K%ZqR-wcILS058 zz8US7!DzHJv6*tt;rw3WffEAsvu(!|dI9El?eSjAgw^N*Tf`WWk*?2S)Bdw~M~ZEG z?i@AGCp_Y@{*IK1j$8*wZ7kQX#!_<}pdKs0RTrm(F(Bum80p7ft`ZoY;@y2Vg7}~I zc+3Em$3!!z9Fm17Ph?{3B->&c@V94DgO^H(TLpH^lWHER;qcnA4Cxce8`&HYxhj_F zqZRRZhKEt&TpEXZ5*fHiVKc`CMu+g1>bittTS&QU9ySTfmt+?QI6cOG1mG%qwvg(W z+$kYZ%s|s1gib3H2XiQA+#1epBrBL2>|81x+UUTLztU*gIuuLh>;vP;_U?GnEU=*` znWUz^c=whSsSK|`M1B+?isz?zX%0XyT`3L>;SUyJ`5D#XiXtmAlh6jkl;t1nL2_-y z^h~mqfSPZ}+NCksi^W=|uV3aOv>EE`NDZzS>Zc)$%w`bn!xSDC2ot`}-Gd$vM&NQ5t2A=gs9Vx+KGUzgyxB*?j^{q-FAogSpNUZ~#Q*1(P z?-J&gw}|p=PsZbeXz0OQhtGu?RwM@r1NwHhfOIC-KPYW4^F1*R6^bQzwQng9qy5&A zk~avksV`>OGGEzkn0}2XWN`!I<93+81lyX=Xfk#TX5egOpvU;IEx|m>0WKa&BpEx8 z-DV8KI1;DUVlrolfIRaQ`6Phpx;)iLYX%3!g&Ht?sE-yWGRO(@7Dm>fIkD#9ESIM) z#gl#d^7wXy2C;k>Rd>XB3T~^6ILRi=K0t-S&1qH!SVOmh^5Cp^JZS0fiud%u@vp-m z0;V=>zVH){pfQbFszq0GBGx+qgH3d&t+h&;pd_A_^`r?E!z4E~fFO^1n6kBD%uAaj zwyljObmIm;3j5w046EZXQVDo6VGkaBwKiCf?qd)ai-R?NX#~i zpj2!|Ng`fPBDh&S&Rf}a2`q=u0BR{|;&3A)DD7B9fRP7NHD%$cYo8fx9Kbk~G!d+H z%#g~=L@<*c$e3Z%N>;=((ka>#{T#$&fFD>&$q=0(xK`95ndnZal4TgDc2F{`(2P{M zIleiD7Gp(nwfIQ?qF3hF1*c_`k#eD%m!rFb(8Pkxd-) zQCmY98A|i;PwYLBo;$pxf#>9sd4$2n0WSh%$ffL>K%o{#b9|eP>CzlO%V{xL%UILFyk4t;6!j!|Box6hf*z6D0lzIPxao9aw$?O_rErZP|nW~-SU4QfEc z@4*lDskF^;a}-jQz`T}cGAP;Dpxs;YSbfDYuZWPCv&DgrRrGF4;Yntbr zn4=0t^&OPLxgD16IEgUu+)6`$7&U-z#y1EPIAxFHyrdd96)`@D^S>UXp`s>)`oM$1 z4`1nBigOrTjCP#M7igMdpba8z0`IbkAves)QO0zf&DY~wm;A3D`KOS!pT7ZvCzpds zA!t2PqE>yVJT8HJoEwdgfgihjz|(l=3!IBt7b=URq(PL*b>g@L^B1Hg|3T2mbr#pC zr3K{=BIORV{%K&GHwIJOalva(L@sPX0*@dyRw#g55at{QA$f*qT05u)Z4;>UXwQe! zsaj2VPpf7uhO`5qv6j0e=Kij(=UQF>R%hRK^r~bT84jTLDqgiuIry<2p^I%PZoek?Wcb^m;>1WKWa`82MxN{u=e@1hyFO>r*m zqM3No>OSO_L5XQdG#&qxZ8V@h9O^-Rx{x}K8gcFW!I44?>#GmpS)k9r)7ECQmq+;$HeP9}KC2(x6h}GJNpnmmI&HdW@L+PDos|*1W!$%{oO+NK*Grq&XzHAG zl%SnLH#Othj#^Mv7h<^02B1T>jwGJ8p5mzi7rqqZTF>0RRXCSy=br9UWyIhKte(te zQlq6~%QCh>kArCMoMq%}f^E#|Ib1sTS@N+wEIs+UA-&jUG50;yZ{m=UJj!1X&fMAR z*;4z^!*ljQ9_3Xi#QlwH#pQF~B_HR#on<}Ol2zF-hB9d3;F4NtW+9g$v?}Y6d`Xe1 zSL9*o$hDK@@N^@0_KHd#esYOar0lg5oJd`4VOXUT@^EqKx-ic&4pDO0Em@#$Z}IWMIqHaVCtlc@Mx%Su)Vpu`iz*C*@hFie zM|~)drx@|kCH9Yf9rNqd33trST85S5V7c6?+%MGBgRp%)_I5EO*2w)sO?dNbNXJ2k z`Tem|hEVPi-9*R1@-Icrx{!NzfIALa99bi_c{Q=%)`JH~jeX0hWeQJ6l>HrVJ&r7o z7iWtxG98=u97Jp9ChP;~MT5YVzrIw)G8~gbcbLEwsO6)9apU-v#S1hnU@ktEb~;pD zW}!xG*Zr^t9#N^tn(lRCB5ubp1x}20$(9y7QFcFiK&LDv(Z_sN%!w#d)t`#2GF8oU z7;1h@e)DiT?}5JAqWWdb#pJhltaZyXBVIPEx8G*&dB^0L57kOsBcA{8b`H;p)Pikn#+of?3Col4!Y>Yt z+b50LPp7#RCB9_KvFMRUN&778@TKugh-c*Fk`=?4i~@%*QEjbQ3*7vXv-{lgpK5YjPo3aY+ho>EZZq`A7Kkq)p|yA^&+W!@5w=M5unM(aQCnA?sI$p` z0%|-2S*(qT6JbHz{%o`G=O>_cs)k>3BBfN$)Fe39NS{h-t znNDC^f%EDPGnnB$e~rTJqWzUbU_ZsSFLQisaH`dsTEp=QpN2m>7MjUTQ0vhU`OepJ zXGd;2&V{=kH>cHf+VEW`tAO_AJ&DD%n}9YZ3+E%XHcuUSH!zJ(sEvu6IZ}x{B&*GV z6Ia6|I#VzHv=idk)Z)S_)9M{mz&q7EP1t;*oZLu3?B;cBv%8VAlA~#C-VaiINz%q- zO?)(^su>8+JG9{|PLx|pVfk|jTA26G)rk%}bH=n|T6~ODH=k+pLZAJ#>bYvT;1Z}P zrxpz1W3tsavOJ!yWgr302#WdijwfS-_=eY*4cj9Nv~c#{JR8mx%3-GQe1+$RsB$P5 z%SWaV3P+~dIh2Rj9-w`2ER4aD%W4P+-$u_U4%i*g|wBqdUDl6nMElQ8nk4841Ra(|}S8%_xjy7yZ3ndn(I-{2* z*a?nzP2%FwM+r;8`ZE{{%d*>+1gwr!pxS%|tFVQx_r^SS6C zItkx<=*O|0I*(P$QJ%z0w~il={=$yJ+C-7!$a*c`UKYMwo2&^WW|&NqHJ{(&3k5aBfjIE-m+bvoz*82E zJ0N-)Vket1Oyc;-gi2Ss0#4EbliVIXyt)!UyP$=K??a)GaGxjQK)l!M5n{Lv^$zuW zJdR1>t)YIT(k8hhV7~==(7bpeyHI}-Di8p@GEnKji@YH3@Y4`S2?ccy?}6Tg2qm$| zAe7*R<5~bY;7tm8s6W*2^5}u^RunNwbc_mkJ&y3|@KAUMR26O$`JMp`4L>XJd2XRe zXeTXD=|ZJrIx6P!3-mz7k2pP$4J`|WL-0U}2Ta_+0m*f1cx!k*w>@kPVuI?wu?P)Br-| zq#}kvdO;?$K7PcUPs$=W&LIuR_x?0U=TN)f$>rg8`zcq3iu#7#12i z+^TpS&`_nz?{QYT!o$~lp~Z*;(2MuqQl-lU^$mZ<7jbJ|`QSAdz`3a)WKj@}Qz&LW zNm;G3`AN#eClx}Y(eMyj6itj`^*|5-w1YQLgs9=$!dq3G3mt3tHj(F+NyymGZRJG; z!>s{`7cR^dWa<@$5-#K>)dQs-hcqcfKwr!WGW-S2kA~L+-UoMXTsMBsi&uMR+`IDM zzWTW@{chF!A7fMEr4DtEZ_&sM-|zLWg;oZ~b|>pHEBRmJQq=G#PHgFF>U#J)QJcm> zr2H!?`G@Eq82bWvl4jk1=^Fd&M_#cR9Qz^;f5YZD6nOXxHp#KCVgBtC`~8~ZU~&1^ zYmBk4O_%J0@F^Nk)A`DHe*KQg$Pag@Y8|ZehDR?Qx9rtziN0e|*rBB7eKSk?kyjQ@ zKtbxB!ZF#{;c7JUD#FIGR+;^N$>y=n{NUFdE*#5Z^6xg_TiEaag4?0=&slRnIMUUI zV;Tw$S12#F^KUkciK9IH!GG?O)FsEF#F5(whcAph8gFI|9RH&17aC4LarWB;C!p1G z8{sFQZuYwbJIA8sj(i?{u&V^a!+(vk*%Mfo9R4~I*mpyRZygIA6oTS zBS-h6XjA?bI#C|z(6|l6 zjESv`l;6VH5%V#JbfA7kUvt@13*TKJ*MxB5+*PPhW{FPIEpd7>M@ z-f=879Mc}pNLOeb5FhUFdrYP)M^lh>_B|%cNUOjj9ep1|5B|$fwZ}xI@8=jB2d4Oa zAq_yU!;3+@!PA%kQV)Rc_Ik|YWrsVo-QfaoUTsV;ou{Ce+WTcU!}S{8$|>1TCPDAx3bN9q@s~ zr@=U;jOY@==`J~O1{lzFKFkakdhlcIIMxd|@H!PQ4nF0W67SasH=o(cX}pd@KOD&u z@{V0nQMUWK^f4%B3Fc5KZ&K6n#QKKpwIlPXB3kyL)0>#epTg~_qm6P8*Rpg@i zm=*Db5eH|gBDnTj16~|vhqo$hY^%gM7@hHJ>@gmF>M%Kuiqx=?XGAVM{qzVsY0;fq*6h)GzL{?l- zxUkZcR%8!Ym_*{tIUC8!gf>Hb?5b1?+hRo8ov%DViG1)5T-{xO$mS`!I!n(o1{_iH zI-@W;1Of=)v^h#T0+lW%Z(`8nMaPm}HCaO+>(I+Dz^jB-q;l^T#G6I&iZKm*y6_bt zf%#rf{NU`MMq5^H-i&v0#gY*NZw15qMI))r5#fk5wnqE#0^GBvPmd)Uy5x1o-KqZ5 zBkj%S*F_Qo-ATNNbD%e(-b_^&;n#`PMeqWoy2#3=HFXj7`aAQ*ND;gQ67NoMu|L2s zV313Sz%^6+!Wq8{t{GoaoupAk_T8?LZ-2oQW7dqBXX52J8cl6kJa5U&8E4F{KV$Kd zdG&K?O0oHM4nc^L%{I2|q=FSGPsv^?Z;M@9m5Apltr!)8&`nKV@a0 zIC}LJ{C$sTO?z|uf=OTg$oY5ts`26JXJ2#Y2X{hKL>Hd5QQiW#QL4XjX{u*g+=y=! z;Wy&tcA5HQ3U3%Sqw#L7jooRy(QvRn-LqvQ-YUMashv^0Z*(Kq5)ZtgbR%AS%bGSx z4TC*hEZfQYsryY%vLzgj{?>y7KaZFF1f6pbUWfPTbON@}8iZQ$ew`J-TLG6K z%%5*LUw@ZhtEJ-?LvC1=d*WSN^5HC1$2JLgG~-W0uDp}F1h>NYi&5E|t%#dSoT>w{ zJYh*Ao^Pg`Zw5jP(N~;?O9pD$O@MQ)3PK*8P zx45&08g0fueuaQ~7gYp#tFLWYZ`n#AK7uc-TknyI;Fn)oDN5GdH}}4&gT1Nebfi@; zV&V69@$mm?u|jrvjipa%|8yWpyl|DF%GSS>}w>{irazejXO=ErQBC- zBeJmW=GVc16BoG5`tnyU2k=$g6?n>*IuW0%58)*<{7X5OE}N0dLEc-Hmj=J51|9Hc z9)7DYmv$Y}^40xZyUm6){C2IG@|;0)@rEjHkGc3Q9!)GjO-%U6H}RqJyX#-!$x%HX*5XJ}rV@Qp<0{S&(8T!G+^f3rRF++R9T| zA+I%9(+0l&%a)=(3q|ggW_jG6EVre*?AK^dz9*e{ L|0mG#)xiG;LGn7W literal 0 HcmV?d00001 diff --git a/dll/aliyun-net-sdk-core.dll b/dll/aliyun-net-sdk-core.dll new file mode 100644 index 0000000000000000000000000000000000000000..dee894c1cd057093a897fef317dab9267f5e25e3 GIT binary patch literal 61952 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