Добавление случая, когда имя класса для объекта, используемого в структуре сущности, такое же, как имя класса для файла с кодировкой веб-формы.
Предположим, у вас есть веб-форма Contact.aspx, чей класс codebehind Свяжитесь с вами, и у вас есть имя объекта Contact.
Затем следующий код вызовет исключение NullReferenceException при вызове context.SaveChanges ()
Contact contact = new Contact { Name = "Abhinav"};
var context = new DataContext();
context.Contacts.Add(contact);
context.SaveChanges(); // NullReferenceException at this line
Ради полноты класса DataContext
public class DataContext : DbContext
{
public DbSet Contacts {get; set;}
}
и класс сущности контакта. Иногда классы сущностей являются частичными классами, так что вы можете распространять их и в других файлах.
public partial class Contact
{
public string Name {get; set;}
}
Ошибка возникает, когда оба класса entity и codebehind находятся в одном и том же пространстве имен. Чтобы исправить это, переименуйте класс сущности или класс codebehind для Contact.aspx.
Причина. Я все еще не уверен в причине. Но всякий раз, когда какой-либо из классов сущностей расширяет System.Web.UI.Page, возникает эта ошибка.
Для обсуждения рассмотрим NullReferenceException в DbContext.saveChanges ()
Сначала вам нужно получить общедоступный сертификат с сервера, к которому вы пытаетесь подключиться. Это можно сделать разными способами, например, связаться с администратором сервера и запросить его, с помощью openssl, чтобы загрузить его , или, поскольку это, как представляется, HTTP-сервер, подключающийся к нему с помощью любого браузера, просмотра информации о безопасности страницы и сохранения копии сертификата. (Google должен уметь точно сказать, что делать для вашего конкретного браузера.)
Теперь, когда у вас есть сертификат, сохраненный в файле, вам нужно добавить его в хранилище доверия JVM. В $JAVA_HOME/jre/lib/security/
для JRE или $JAVA_HOME/lib/security
для JDK есть файл с именем cacerts
, который поставляется с Java и содержит общедоступные сертификаты известных сертифицирующих органов. Чтобы импортировать новый сертификат, запустите keytool как пользователь, у которого есть разрешение на запись в cacerts:
keytool -import -file <the cert file> -alias <some meaningful name> -keystore <path to cacerts file>
Скорее всего, он попросит вас ввести пароль. Пароль по умолчанию, поставляемый с java, - changeit
. Его почти никто не изменяет. После того, как вы выполните эти относительно простые шаги, вы будете уверенно общаться и с уверенностью, что разговариваете с нужным сервером и только с правильным сервером (пока они не потеряют свой закрытый ключ).
Теперь я решил эту проблему таким образом,
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.io.OutputStream;
// Create a trust manager that does not validate certificate chains like the default
TrustManager[] trustAllCerts = new TrustManager[]{
new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers()
{
return null;
}
public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType)
{
//No need to implement.
}
public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType)
{
//No need to implement.
}
}
};
// Install the all-trusting trust manager
try
{
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
}
catch (Exception e)
{
System.out.println(e);
}
Конечно, это решение должно использоваться только в сценариях, где невозможно установить требуемые сертификаты с помощью keytool
, например. локальное тестирование с временными сертификатами.
Всякий раз, когда мы пытаемся подключиться к URL-адресу,
, если сервер на другом сайте работает по протоколу https и обязателен для связи через информацию, предоставленную в сертификате, у нас есть следующая опция:
1) запросить сертификат (загрузить сертификат), импортировать этот сертификат в доверенность. По умолчанию для использования функции доверия по умолчанию java можно найти в \ Java \ jdk1.6.0_29 \ jre \ lib \ security \ cacerts, тогда если мы попытаемся подключиться к URL-соединению, будет принято.
2) В обычном бизнесе мы можем подключаться к внутренним URL-адресам в организациях, и мы знаем, что они верны. В таких случаях вы доверяете правильному URL-адресу. В таких случаях выше может использоваться код, который не будет указывать на сохранение сертификата для подключения к определенному URL-адресу.
для точки 2 для выполнения следующих шагов:
1) напишите ниже метод, который устанавливает HostnameVerifier для HttpsURLConnection, который возвращает true для всех случаев, то есть мы доверяем trustStore.
// trusting all certificate
public void doTrustToCertificates() throws Exception {
Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
TrustManager[] trustAllCerts = new TrustManager[]{
new X509TrustManager() {
public X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkServerTrusted(X509Certificate[] certs, String authType) throws CertificateException {
return;
}
public void checkClientTrusted(X509Certificate[] certs, String authType) throws CertificateException {
return;
}
}
};
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
HostnameVerifier hv = new HostnameVerifier() {
public boolean verify(String urlHostName, SSLSession session) {
if (!urlHostName.equalsIgnoreCase(session.getPeerHost())) {
System.out.println("Warning: URL host '" + urlHostName + "' is different to SSLSession host '" + session.getPeerHost() + "'.");
}
return true;
}
};
HttpsURLConnection.setDefaultHostnameVerifier(hv);
}
2) напишите ниже метод , который вызывает doTrustToCertificates перед попыткой подключиться к URL
// connecting to URL
public void connectToUrl(){
doTrustToCertificates();//
URL url = new URL("https://www.example.com");
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
System.out.println("ResponseCode ="+conn.getResponseCode());
}
Этот вызов вернет код ответа = 200 означает, что соединение выполнено успешно.
Для получения более подробной информации и примера примера вы можете обратиться к URL .
SSLHandshakeException может быть разрешен двумя способами.
Я считаю, что вы пытаетесь подключиться к чему-то, используя SSL, но что-то предоставляет сертификат, который не проверяется корневыми органами сертификации, такими как verisign. По сути, по умолчанию безопасные соединения могут быть установлены только в том случае, если человек, пытающийся для подключения знает ключи контрагентов или какой-то другой верндор, например verisign, может вмешаться и сказать, что предоставленный публичный ключ действительно прав.
Надежность всех ОС. Несколько авторитетных центров сертификации и более мелких эмитентов сертификатов должны быть сертифицированным одним из крупных сертификаторов, создающим цепочку сертификаторов, если вы понимаете, что я имею в виду ...
В любом случае вернемся к делу. У меня была аналогичная проблема при программировании Java-апплета и Java сервер. (Надеюсь, когда-нибудь я напишу полный блог-блог о том, как я получил всю безопасность для работы :))
По сути, мне нужно было извлечь открытые ключи с сервера и сохранить их в хранилище ключей внутри моего апплета и когда я подключился на сервер я использовал этот хранилище ключей для создания фабрики доверия и фабрики доверия для создания соединения ssl. Существуют также альтернативные процедуры, такие как добавление ключа к доверенному хосту JVM и изменение хранилища доверия по умолчанию при запуске.
Я сделал это примерно два месяца назад и не имею исходного кода для меня прямо сейчас .. используйте Google, и вы должны решить эту проблему. Если вы не можете передать мне сообщение, и я могу предоставить вам соответствующий исходный код для проекта. Не знаете, решает ли эта проблема вашу проблему, поскольку вы не предоставили код, который вызывает эти исключения. Кроме того, я работал с апплетами, я думал, что не могу понять, почему это не работает на Serverlets ...
P.S Я не могу получить исходный код перед выходными, так как внешний SSH отключен в моем офисе: (
Теперь я решил эту проблему таким образом,
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.io.OutputStream;
// Create a trust manager that does not validate certificate chains like the
default TrustManager[] trustAllCerts = new TrustManager[] {
new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) {
//No need to implement.
}
public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) {
//No need to implement.
}
}
};
// Install the all-trusting trust manager
try {
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
} catch (Exception e) {
System.out.println(e);
}