Session in windows application

ASP Session

Overview

You must have memory resources on the server to preserve ASP session state, and the amount of memory that is required varies depending on the amount of information that you are storing in each session. To help regulate the resources that IIS 7 will use, you can specify the settings for session state. For example, the max attribute specifies the maximum number of sessions to store, and the timeout attribute specifies the duration of each ASP session.

If your applications do not require session state, setting the allowSessionState attribute to false will disable ASP session state.

Compatibility

Version Notes
IIS 10.0 The element was not modified in IIS 10.0.
IIS 8.5 The element was not modified in IIS 8.5.
IIS 8.0 The element was not modified in IIS 8.0.
IIS 7.5 The element was not modified in IIS 7.5.
IIS 7.0 The element of the element was introduced in IIS 7.0.
IIS 6.0 The element replaces the following IIS 6.0 metabase properties:
  • AspAllowSessionState
  • AspKeepSessionIDSecure
  • AspSessionMax
  • AspSessionTimeout

Setup

To support and configure ASP applications on your Web server, you must install the ASP module. To install the ASP module, use the following steps.

Windows Server 2012 or Windows Server 2012 R2

  1. On the taskbar, click Server Manager.
  2. In Server Manager, click the Manage menu, and then click Add Roles and Features.
  3. In the Add Roles and Features wizard, click Next. Select the installation type and click Next. Select the destination server and click Next.
  4. On the Server Roles page, expand Web Server (IIS), expand Web Server, expand Application Development, and then select ASP.
  5. If the Add features that are required by ASP? dialog box appears, click Add Features. (This page appears only if you have not already installed the ISAPI Extensions role service on your server.)
  6. On the Server Roles page, click Next.
  7. On the Select features page, click Next.
  8. On the Confirm installation selections page, click Install.
  9. On the Results page, click Close.

Windows 8 or Windows 8.1

On the Start screen, move the pointer all the way to the lower left corner, right-click the Start button, and then click Control Panel.

In Control Panel, click Programs and Features, and then click Turn Windows features on or off.

Expand Internet Information Services, expand World Wide Web Services, expand Application Development Features, and then select ASP.

The ISAPI Extensions role will be selected if it has not already been installed.

Click OK.

Click Close.

Windows Server 2008 or Windows Server 2008 R2

  1. On the taskbar, click Start, point to Administrative Tools, and then click Server Manager.
  2. In the Server Manager hierarchy pane, expand Roles, and then click Web Server (IIS).
  3. In the Web Server (IIS) pane, scroll to the Role Services section, and then click Add Role Services.
  4. On the Select Role Services page of the Add Role Services Wizard, select ASP.
  5. If the Add role services required by ASP dialog box appears, click Add Required Role Services. (This page appears only if you have not already installed the ISAPI Extensions role service on your server.)
  6. On the Select Role Services page, click Next.
  7. On the Confirm Installation Selections page, click Install.
  8. On the Results page, click Close.

Windows Vista or Windows 7

  1. On the taskbar, click Start, and then click Control Panel.
  2. In Control Panel, click Programs and Features, and then click Turn Windows Features on or off.
  3. Expand Internet Information Services, then World Wide Web Services, then Application Development Features.
  4. Select ASP, and then click OK.

How To

How to configure ASP session state settings for a site or application

Open Internet Information Services (IIS) Manager:

If you are using Windows Server 2012 or Windows Server 2012 R2:

  • On the taskbar, click Server Manager, click Tools, and then click Internet Information Services (IIS) Manager.

If you are using Windows 8 or Windows 8.1:

  • Hold down the Windows key, press the letter X, and then click Control Panel.
  • Click Administrative Tools, and then double-click Internet Information Services (IIS) Manager.

If you are using Windows Server 2008 or Windows Server 2008 R2:

  • On the taskbar, click Start, point to Administrative Tools, and then click Internet Information Services (IIS) Manager.

If you are using Windows Vista or Windows 7:

  • On the taskbar, click Start, and then click Control Panel.
  • Double-click Administrative Tools, and then double-click Internet Information Services (IIS) Manager.

In the Connections pane, expand the server name, expand Sites, and then navigate to the Web site or Web application that you want to configure.

In the site or application Home pane, double-click ASP.

In the ASP pane, expand the Session Properties section and configure your desired settings.

Click Apply in the Actions pane.

Configuration

Attributes

Attribute Description
allowSessionState Optional Boolean attribute.

Specifies whether session state persistence for an ASP application is enabled.

The default value is true . keepSessionIdSecure Optional Boolean attribute.

Specifies whether a session ID is sent as a secure cookie if assigned over a secure session channel.

The default value is true . max Optional uint attribute.

Specifies the maximum number of concurrent sessions.

The default value is 4294967295 . timeout Optional timeSpan attribute.

Specifies the maximum period of time (hh:mm:ss) that a session object is maintained after the last request associated with the object is made.

The default value is 00:20:00 .

Child Elements

Configuration Sample

The following configuration sample enables ASP session state, sets the maximum number of ASP sessions to 1000, and sets the session time-out to 10 minutes for the Default Web Site.

Sample Code

The following code samples enable ASP session state, sets the maximum number of ASP sessions to 1000, and sets the session time-out to 10 minutes for the Default Web Site.

Использование сеансов Using Sessions

В приложениях Windows Communication Foundation (WCF) сеанс сопоставляет группу сообщений с диалогом. In Windows Communication Foundation (WCF) applications, a session correlates a group of messages into a conversation. Сеансы WCF отличаются от объектов сеанса, доступных в ASP.NET приложениях, поддерживают различные поведения и управляются различными способами. WCF sessions are different than the session object available in ASP.NET applications, support different behaviors, and are controlled in different ways. В этом разделе описываются функции, которые сеансы включают в приложениях WCF, и способы их использования. This topic describes the features that sessions enable in WCF applications and how to use them.

Сеансы в приложениях Windows Communication Foundation Sessions in Windows Communication Foundation Applications

Если в контракте службы указано, что для него требуется сеанс, это означает, что все вызовы (т. е. обмен сообщениями, на котором он основан) должны быть частью одного диалога. When a service contract specifies that it requires a session, that contract is specifying that all calls (that is, the underlying message exchanges that support the calls) must be part of the same conversation. Если в контракте указано, что сеансы для него разрешены, но не требуются, клиенты могут подключаться, создавая сеанс или не создавая его. If a contract specifies that it allows sessions but does not require one, clients can connect and either establish a session or not establish a session. Если сеанс завершен и по его каналу отправляется сообщение, выдается исключение. If the session ends and a message is sent through the same channel an exception is thrown.

Сеансы WCF имеют следующие основные концептуальные функции: WCF sessions have the following main conceptual features:

Они явным образом инициируются и завершаются вызвавшим приложением (клиентом WCF). They are explicitly initiated and terminated by the calling application (the WCF client).

Сообщения, доставленные в ходе сеанса, обрабатываются в порядке их получения. Messages delivered during a session are processed in the order in which they are received.

Сеанс коррелирует группу сообщений в диалог. Sessions correlate a group of messages into a conversation. Возможны различные типы корреляций. Different types of correlation are possible. Например, один основанный на сеансах канал может коррелировать сообщения, основываясь на общем сетевом подключении, а другой — основываясь на общем теге в тексте сообщения. For instance, one session-based channel may correlate messages based on a shared network connection while another session-based channel may correlate messages based on a shared tag in the message body. Функции, получаемые в результате сеанса, зависят от характера корреляции. The features that can be derived from the session depend on the nature of the correlation.

Нет общего хранилища данных, связанного с сеансом WCF. There is no general data store associated with a WCF session.

Если вы знакомы с System.Web.SessionState.HttpSessionState классом в приложениях ASP.NET и предоставляемыми им функциями, вы можете заметить следующие различия между этим видом сеанса и сеансами WCF: If you are familiar with the System.Web.SessionState.HttpSessionState class in ASP.NET applications and the functionality it provides, you might notice the following differences between that kind of session and WCF sessions:

Сеансы ASP.NET всегда инициируются сервером. ASP.NET sessions are always server-initiated.

Сеансы ASP.NET неявно неупорядочены. ASP.NET sessions are implicitly unordered.

Сеансы ASP.NET предоставляют общий механизм хранения данных для запросов. ASP.NET sessions provide a general data storage mechanism across requests.

Содержание этого раздела: This topic describes:

Поведение выполнения по умолчанию при использовании привязок, основанных на сеансе, в уровне модели службы. The default execution behavior when using session-based bindings in the service model layer.

Типы функций, предоставляемых системными привязками, основанными на сеансах WCF. The types of features that the WCF session-based, system-provided bindings provide.

Создание контракта, объявляющего требование сеанса. How to create a contract that declares a session requirement.

Управление созданием и прекращением сеанса и его связью с экземпляром службы. How to understand and control the creation and termination of the session and the relationship of the session to the service instance.

Поведение выполнения по умолчанию с использованием сеансов Default Execution Behavior Using Sessions

Привязка, пытающаяся инициировать сеанс, называется основанной на сеансе . A binding that attempts to initiate a session is called a session-based binding. Контракты служб указывают о том, что для них требуются, допускаются или не допускаются привязки, основанные на сеансе. Для этого свойству ServiceContractAttribute.SessionMode интерфейса (или класса) контракта службы присваивается одно из значений перечисления System.ServiceModel.SessionMode . Service contracts specify that they require, permit, or refuse session-based bindings by setting the ServiceContractAttribute.SessionMode property on the service contract interface (or class) to one of the System.ServiceModel.SessionMode enumeration values. По умолчанию значение этого свойства равно Allowed , а это означает, что если клиент использует привязку на основе сеанса с реализацией службы WCF, служба устанавливает и использует предоставленный сеанс. By default, the value of this property is Allowed, which means that if a client uses a session-based binding with a WCF service implementation, the service establishes and uses the session provided.

Когда служба WCF принимает сеанс клиента, по умолчанию включаются следующие функции. When a WCF service accepts a client session, the following features are enabled by default:

Все вызовы между объектом клиента WCF обрабатываются одним и тем же экземпляром службы. All calls between a WCF client object are handled by the same service instance.

Различные привязки на основе сеанса предоставляют дополнительные возможности. Different session-based bindings provide additional features.

Типы сеансов, предоставляемые системой System-Provided Session Types

Привязка, основанная на сеансе, поддерживает ассоциацию по умолчанию экземпляра службы с определенным сеансом. A session-based binding supports the default association of a service instance with a particular session. Впрочем, различные привязки, основанные на сеансе, поддерживают и другие различные функции, помимо описанного выше управления созданием экземпляров на основе сеанса. However, different session-based bindings support different features in addition to enabling the session-based instancing control previously described.

WCF предоставляет следующие типы поведения приложений на основе сеансов: WCF provides the following types of session-based application behavior:

Элемент System.ServiceModel.Channels.SecurityBindingElement поддерживает основанные на безопасности сеансы, в которых обе стороны, обменивающиеся информацией, согласовали определенный безопасный диалог. The System.ServiceModel.Channels.SecurityBindingElement supports security-based sessions, in which both ends of communication have agreed upon a specific secure conversation. Дополнительные сведения см. в разделе Защита служб. For more information, see Securing Services. Например, привязка System.ServiceModel.WSHttpBinding , содержащая поддержку как безопасных, так и надежных сеансов, по умолчанию использует только безопасный сеанс, шифрующий сообщения и защищающий их цифровой подписью. For example, the System.ServiceModel.WSHttpBinding binding, which contains support for both security sessions and reliable sessions, by default uses only a secure session that encrypts and digitally signs messages.

Привязка System.ServiceModel.NetTcpBinding поддерживает сеансы, основанные на TCP/IP, что обеспечивает корреляцию всех сообщений по подключению на уровне сокетов. The System.ServiceModel.NetTcpBinding binding supports TCP/IP-based sessions to ensure that all messages are correlated by the connection at the socket level.

Элемент System.ServiceModel.Channels.ReliableSessionBindingElement , реализующий спецификацию WS-ReliableMessaging, обеспечивает поддержку надежных сеансов, в которых можно настроить отправку сообщений в определенном порядке и только один раз, что гарантирует получение сообщений, даже когда при диалоге они проходят через несколько узлов. The System.ServiceModel.Channels.ReliableSessionBindingElement element, which implements the WS-ReliableMessaging specification, provides support for reliable sessions in which messages can be configured to be delivered in order and exactly once, ensuring messages are received even when messages travel across multiple nodes during the conversation. Дополнительные сведения см. в разделе Надежные сеансы. For more information, see Reliable Sessions.

Привязка System.ServiceModel.NetMsmqBinding обеспечивает сеансы датаграммы MSMQ. The System.ServiceModel.NetMsmqBinding binding provides MSMQ datagram sessions. Дополнительные сведения см. в разделе очереди в WCF. For more information, see Queues in WCF.

Установка свойства SessionMode указывает о том, что для контракта требуется сеанс, но не задает тип этого сеанса. Setting the SessionMode property does not specify the type of session the contract requires, only that it requires one.

Создание контракта, требующего сеанс Creating a Contract That Requires a Session

Создание контракта, требующего сеанс, означает, что группа операций, объявляемых контрактом службы, должна выполняться в пределах одного сеанса и сообщения должны быть доставлены в определенном порядке. Creating a contract that requires a session states that the group of operations that the service contract declares must all be executed within the same session and that messages must be delivered in order. Чтобы назначить уровень поддержки сеансов, требуемый контрактом, задайте в качестве значения свойства ServiceContractAttribute.SessionMode класса или интерфейса контракта службы перечисление System.ServiceModel.SessionMode . При этом указывается одно из следующих условий контракта: To assert the level of session support that a service contract requires, set the ServiceContractAttribute.SessionMode property on your service contract interface or class to the value of the System.ServiceModel.SessionMode enumeration to specify whether the contract:

Требуется сеанс. Requires a session.

Клиенту допускается создавать сеанс. Allows a client to establish a session.

Сеансы запрещены. Prohibits a session.

Впрочем, установка свойства SessionMode не указывает требуемый контрактом тип поведения, основанного на сеансе. Setting the SessionMode property does not, however, specify the type of session-based behavior the contract requires. Он предписывает WCF подтвердить во время выполнения, что настроенная привязка (которая создает коммуникационный канал) для службы, не поддерживает или не может установить сеанс при реализации службы. It instructs WCF to confirm at runtime that the configured binding (which creates the communication channel) for the service does, does not, or can establish a session when implementing a service. Опять же, привязка может выполнить это требование с любым типом поведения, основанного на сеансе: безопасность, транспорт, надежность или некоторая комбинация этих типов. Again, the binding can satisfy that requirement with any type of session-based behavior it chooses—security, transport, reliable, or some combination. Конкретное поведение зависит от выбранного значения System.ServiceModel.SessionMode . The exact behavior depends on the System.ServiceModel.SessionMode value selected. Если настроенная для службы привязка не соответствует значению SessionMode, выдается исключение. If the configured binding of the service does not conform to the value of SessionMode, an exception is thrown. Привязки и создаваемые ими каналы, поддерживающие сеансы, называются основанными на сеансах. Bindings and the channels they create that support sessions are said to be session-based.

Следующий контракт службы указывает, что все операции в ICalculatorSession необходимо выполнить в пределах одного сеанса. The following service contract specifies that all operations in the ICalculatorSession must be exchanged within a session. Ни одна операция не возвращает значение вызвавшему объекту, за исключением метода Equals . None of the operations returns a value to the caller except the Equals method. Впрочем, метод Equals не принимает параметры, а потому может возвращать только ненулевое значение в пределах сеанса, в котором данные уже переданы другим операциям. However, the Equals method takes no parameters and, therefore, can only return a non-zero value inside a session in which data has already been passed to the other operations. Для правильной работы этого контракта требуется сеанс. This contract requires a session to function properly. При отсутствии сеанса, связанного с определенным клиентом, экземпляр службы не может определить, какие именно данные отправил клиент. Without a session associated with a specific client, the service instance has no way of knowing what previous data this client has sent.

Если сеанс разрешен службой, он создается и используется, если он инициирован клиентом. В противном случае сеанс не создается. If a service allows a session, then a session is established and used if the client initiates one; otherwise, no session is established.

Сеансы и экземпляры служб Sessions and Service Instances

При использовании поведения создания экземпляров по умолчанию в WCF все вызовы между объектом клиента WCF обрабатываются одним и тем же экземпляром службы. If you use the default instancing behavior in WCF, all calls between a WCF client object are handled by the same service instance. Таким образом, на уровне приложения можно считать, что сеанс обеспечивает поведение приложений, аналогичное поведению местных вызовов. Therefore, at the application level, you can think of a session as enabling application behavior similar to local call behavior. Например, при создании локального объекта происходит следующее: For example, when you create a local object:

Вызывается конструктор. A constructor is called.

Все последующие вызовы к клиентской ссылке на объект WCF обрабатываются одним и тем же экземпляром объекта. All subsequent calls made to the WCF client object reference are processed by the same object instance.

Деструктор вызывается при уничтожении ссылки на объект. A destructor is called when the object reference is destroyed.

Сеансы обеспечивают аналогичное поведение при взаимодействии между клиентами и службами, если используется поведение создания экземпляров службы по умолчанию. Sessions enable a similar behavior between clients and services as long as the default service instance behavior is used. Если контракт службы требует или поддерживает сеансы, можно отметить операцию (или несколько операций) как инициирующую или завершающую сеанс. Для этого необходимо задать свойства IsInitiating и IsTerminating . If a service contract requires or supports sessions, one or more contract operations can be marked as initiating or terminating a session by setting the IsInitiating and IsTerminating properties.

Инициирующие операции — это операции, вызываемые в качестве первых операций новых сеансов. Initiating operations are those that must be called as the first operation of a new session. Неинициирующие операции могут вызываться только после вызова по крайней мере одной инициирующей операции. Non-initiating operations can be called only after at least one initiating operation has been called. Поэтому можно создать некоторое подобие конструктора сеансов для службы, объявив инициирующие операции, которые принимают от клиентов входные данные, как подходящие для создания экземпляра службы. You can therefore create a kind of session constructor for your service by declaring initiating operations designed to take input from clients appropriate to the beginning of the service instance. (Впрочем, состояние ассоциируется с сеансом, а не с объектом службы.) (The state is associated with the session, however, and not the service object.)

Завершающие операции— это, соответственно, операции, вызываемые как последние сообщения существующих сеансов. Terminating operations, conversely, are those that must be called as the last message in an existing session. В случае по умолчанию WCF повторно использует объект службы и его контекст после закрытия сеанса, с которым была связана эта служба. In the default case, WCF recycles the service object and its context after the session with which the service was associated is closed. Поэтому можно создать некоторое подобие деструктора, объявив завершающие операции, которые выполняют функции по завершению действия экземпляра службы. You can, therefore, create a kind of destructor by declaring terminating operations designed to perform a function appropriate to the end of the service instance.

Поведение по умолчанию имеет сходство с локальными конструкторами и деструкторами, но это не более чем сходство. Although the default behavior bears a resemblance to local constructors and destructors, it is only a resemblance. Любая операция службы WCF может быть инициированной или завершающей операцией одновременно. Any WCF service operation can be an initiating or terminating operation, or both at the same time. Кроме того, в случае по умолчанию инициирующие операции можно вызывать сколько угодно раз и в любом порядке. После того как сеанс установлен и связан с экземпляром, дополнительные сеансы могут быть созданы только в случае осуществления явным образом управления временем существования экземпляра службы (путем обработки объекта System.ServiceModel.InstanceContext ). In addition, in the default case, initiating operations can be called any number of times in any order; no additional sessions are created once the session is established and associated with an instance unless you explicitly control the lifetime of the service instance (by manipulating the System.ServiceModel.InstanceContext object). И наконец, состояние связывается с сеансом, а не с объектом службы. Finally, the state is associated with the session and not the service object.

Например, контракт, ICalculatorSession использованный в предыдущем примере, требует, чтобы клиентский объект WCF сначала вызывал Clear операцию перед любой другой операцией и что сеанс с этим объектом клиента WCF должен завершаться при вызове Equals операции. For example, the ICalculatorSession contract used in the preceding example requires that the WCF client object first call the Clear operation prior to any other operation and that the session with this WCF client object should terminate when it calls the Equals operation. В следующем примере кода приведен контракт, обеспечивающий выполнение этих требований. The following code example shows a contract that enforces these requirements. Для инициации сеанса сначала необходимо вызвать операцию Clear , а завершится сеанс при вызове операции Equals . Clear must be called first to initiate a session, and that session ends when Equals is called.

Службы не начинают сеансы с клиентами. Services do not start sessions with clients. В клиентских приложениях WCF существует прямая связь между временем существования канала на основе сеанса и временем существования самого сеанса. In WCF client applications, a direct relationship exists between the lifetime of the session-based channel and the lifetime of the session itself. Таким образом, клиенты создают новые сеансы путем создания новых каналов, основанных на сеансах, и прерывают существующие сеансы путем правильного закрытия этих каналов. As such, clients create new sessions by creating new session-based channels and tear down existing sessions by closing session-based channels gracefully. Клиент начинает сеанс с конечной точкой службы путем вызова одной из следующих операций: A client starts a session with a service endpoint by calling one of the following:

Операция инициирования для любого типа клиентского объекта WCF (по умолчанию инициируются все операции). An initiating operation on either type of WCF client object (by default, all operations are initiating). При вызове первой операции клиентский объект WCF автоматически открывает канал и инициирует сеанс. When the first operation is called, the WCF client object automatically opens the channel and initiates a session.

Обычно клиент завершает сеанс с конечной точкой службы путем вызова одной из следующих операций: Typically a client ends a session with a service endpoint by calling one of the following:

ClientBase .Close в объекте клиента WCF, созданном Svcutil.exe. ClientBase .Close on the WCF client object generated by Svcutil.exe.

Завершающая операция для любого типа клиентского объекта WCF (по умолчанию никакие операции не завершаются; контракт должен явно указать завершающую операцию). A terminating operation on either type of WCF client object (by default, no operations are terminating; the contract must explicitly specify a terminating operation). При вызове первой операции клиентский объект WCF автоматически открывает канал и инициирует сеанс. When the first operation is called, the WCF client object automatically opens the channel and initiates a session.

Дополнительные сведения о клиентах и сеансах см. в разделе доступ к службам с помощью клиента WCF. For more information about clients and sessions, see Accessing Services Using a WCF Client.

Сеансы взаимодействуют с параметрами InstanceContext Sessions Interact with InstanceContext Settings

Перечисление SessionMode контракта взаимодействует со свойством ServiceBehaviorAttribute.InstanceContextMode , управляющим связью между каналами и определенными объектами службы. There is an interaction between the SessionMode enumeration in a contract and the ServiceBehaviorAttribute.InstanceContextMode property, which controls the association between channels and specific service objects. Дополнительные сведения см. в разделе сеансы, создание экземпляров и параллелизм. For more information, see Sessions, Instancing, and Concurrency.

Совместное использование объектов InstanceContext Sharing InstanceContext Objects

Также можно задать для каждого вызова или канала, основанного на сеансе, с каким именно объектом InstanceContext он будет ассоциирован, самостоятельно назначив ассоциацию. You can also control which session-based channel or call is associated with which InstanceContext object by performing that association yourself.

Сеансы и потоковая передача Sessions and Streaming

При наличии большого количества данных для передачи режим потоковой передачи в WCF является разумной альтернативой поведению по умолчанию для буферизации и обработки сообщений в памяти целиком. When you have a large amount of data to transfer, the streaming transfer mode in WCF is a feasible alternative to the default behavior of buffering and processing messages in memory in their entirety. При потоковой передаче вызовов с привязкой, основанной на сеансе, может возникнуть непредвиденное поведение. You may get unexpected behavior when streaming calls with a session-based binding. Все потоковые вызовы выполняются через один канал (канал датаграммы), который не поддерживает сеансы, даже если используемая привязка настроена так, чтобы она использовала сеансы. All streaming calls are made through a single channel (the datagram channel) that does not support sessions even if the binding being used is configured to use sessions. Если несколько клиентов выполняют потоковые вызовы одного объекта службы через привязку, основанную на сеансе, и задан «одиночный» режим параллелизма объекта службы и задан режим контекста его экземпляра PerSession , все вызовы должны проходить через канал датаграммы, а потому может обрабатываться не более одного вызова одновременно. If multiple clients make streaming calls to the same service object over a session-based binding, and the service object’s concurrency mode is set to single and its instance context mode is set to PerSession , all calls must go through the datagram channel and so only one call is processed at a time. После этого может исключаться время ожидания одного или нескольких клиентов. Эту ошибку можно обойти, установив для объекта службы значение InstanceContextMode PerCall или параллелизм в значение Multiple. One or more clients may then time out. You can work around this issue by either setting the service object’s InstanceContextMode to PerCall or Concurrency to multiple.

Свойство MaxConcurrentSessions в данном случае ни на что не влияет, поскольку имеется всего один сеанс. MaxConcurrentSessions have no effect in this case because there is only one «session» available.

Читайте также:  Windows 10 образ диска оригинальный
Оцените статью