Я пытаюсь записать некоторые объекты в моем веб-приложении ASP.NET Core 2.1 в читаемый формат в файл.
У меня есть эти 3 объекта:
var username = saml2AuthnResponse.ClaimsIdentity.Claims.ToList();
var username2 = saml2AuthnResponse.ClaimsIdentity.ToString();
var username3 = saml2AuthnResponse.ToXml();
И я записываю их так:
string filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "data.txt");
using (StreamWriter w = new StreamWriter(filePath, true))
{
w.WriteLine("\n");
w.WriteLine("testing...\n");
w.WriteLine(username); // Write the text
w.WriteLine("\n");
w.WriteLine(username2);
w.WriteLine("\n");
w.WriteLine(username3);
}
Однако когда я запускаю приложение и открываю текстовый файл, я вижу только это:
testing...
System.Collections.Generic.List`1[System.Security.Claims.Claim]
testing...
System.Collections.Generic.List`1[System.Security.Claims.Claim]
System.Security.Claims.ClaimsIdentity
System.Xml.XmlDocument
Как я могу заставить его записывать то, что на самом деле содержится в объектах, а не только имя объекта?
Спасибо!
Если цель состоит в том, чтобы иметь возможность прочитать данные из этого файла через некоторое время, вы можете захотеть структурировать все это как один большой объект JSON. Если вы записываете в файл несколько разрозненных объектов/значений, вам нужно будет написать свою собственную логику для анализа этой информации обратно из файла.
Включите класс «самосвал объектов»: stackoverflow.com/questions/1347375/object-dumper-class
Объект «имя пользователя» представляет собой список, для печати его содержимого необходим цикл for:
foreach(var name in username)
{
w.WriteLine(name);
}
Или, если вы уверены, что «имя пользователя» содержит только одно имя, вы можете использовать:
w.WriteLine(username[0]);
Предлагаю вам внимательно прочитать документацию класса ClaimsIdentity
Как я могу заставить его записать то, что на самом деле содержится в объекты, а не только имя объекта?
Судя по вашему общему фрагменту кода и выводам, кажется, что основная проблема в исходном коде заключается в том, что вы записываете ссылки на объекты непосредственно в файл, не преобразуя их содержимое в строковое представление.
Когда вы записываете такие объекты, как lists
, ClaimsIdentity
и XmlDocument
напрямую, StreamWriter
выводит имя типа вместо содержимого объекта.
Чтобы записать содержимое ваших объектов в читаемом формате, вам необходимо явно извлечь информацию из каждого объекта и преобразовать ее в строковый формат для читаемого вывода.
Давайте посмотрим, как мы можем реорганизовать существующий код:
Демо-модель:
public class Saml2AuthnResponse
{
public ClaimsIdentity ClaimsIdentity { get; set; }
public XmlDocument XmlDocument { get; set; }
public XmlDocument ToXml()
{
return XmlDocument;
}
}
Отредактированный фрагмент кода:
var claims = new List<Claim>
{
new Claim(ClaimTypes.Name, "John Doe"),
new Claim(ClaimTypes.Email, "[email protected]"),
new Claim(ClaimTypes.Role, "Administrator")
};
var claimsIdentity = new ClaimsIdentity(claims, "TestAuthType");
var xmlDocument = new XmlDocument();
xmlDocument.LoadXml("<Response><Name>John Doe</Name><Email>[email protected]</Email></Response>");
var saml2AuthnResponse = new Saml2AuthnResponse
{
ClaimsIdentity = claimsIdentity,
XmlDocument = xmlDocument
};
var username = saml2AuthnResponse.ClaimsIdentity.Claims;
var username2 = saml2AuthnResponse.ClaimsIdentity;
var username3 = saml2AuthnResponse.ToXml();
string wwwrootPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "wwwroot");
// I am testing in wwwroot directory but you can do whereever you need
if (!Directory.Exists(wwwrootPath))
{
Directory.CreateDirectory(wwwrootPath);
}
string filePath = Path.Combine(wwwrootPath, "NewDataFile.txt");
//string filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "data.txt");
using (StreamWriter w = new StreamWriter(filePath, true))
{
w.WriteLine("\n");
w.WriteLine("testing...\n");
w.WriteLine("Claims:");
foreach (var claim in username)
{
w.WriteLine($"Type: {claim.Type}, Value: {claim.Value}");
}
w.WriteLine("\nClaimsIdentity:");
w.WriteLine($"AuthenticationType: {username2.AuthenticationType}");
w.WriteLine($"IsAuthenticated: {username2.IsAuthenticated}");
w.WriteLine($"Name: {username2.Name}");
w.WriteLine("\nXML Representation:");
w.WriteLine(username3.OuterXml);
}
Console.WriteLine("Data written to file successfully.");
Выход:
Примечание. Вы можете обратиться к этому официальному документу для получения дополнительного образца.
Сериализация в json, вероятно, будет самым простым вариантом. Используйте объект в качестве оболочки или поместите три объекта в коллекцию (массив, список), затем
File.WriteAllText(fileName,JsonSerializer.Serialize(yourStuff));