Лично, я выступаю за внешние ключи, потому что это формализует отношения между таблицами. Я понимаю, что Ваш вопрос предполагает, что программист не представляет данные, которые нарушили бы ссылочную целостность, но я видел слишком много экземпляров, где ссылочная целостность данных нарушена, несмотря на лучшие намерения!
ограничения Перед внешним ключом (иначе декларативная ссылочная целостность или DRI) много времени было проведено, реализовав эти отношения с помощью триггеров. То, что мы можем формализовать отношения декларативным ограничением, очень мощно.
@John - Другие базы данных могут автоматически создать индексы для внешних ключей, но SQL Server не делает. В SQL Server отношения внешнего ключа являются только ограничениями. Вы должны, определил Ваш индекс на внешних ключах отдельно (который может иметь выгоду.)
Редактирование: я хотел бы добавить, что, IMO, использование внешних ключей в поддержку НА УДАЛЯЕТ, или КАСКАД ON UPDATE является не обязательно хорошей вещью. На практике я нашел, что каскад на удаляет, должен быть тщательно рассмотрен на основе отношений данных - например, сделать у Вас есть естественный родительский ребенок, где это может быть в порядке или является связанной таблицей ряд справочных значений. Используя каскадные обновления подразумевает, что Вы позволяете первичному ключу одной таблицы быть измененным. В этом случае у меня есть общее философское разногласие в этом, первичный ключ таблицы не должен изменяться. Ключи должны быть по сути постоянными.
Если ваш сервер использует аутентификацию NTLM, вы можете попробовать следующее:
CredentialCache cc = new CredentialCache();
cc.Add(
new Uri("https://mywebserver/webpage"),
"NTLM",
new NetworkCredential("user", "password"));
request.Credentials = cc;
Посмотрите, появляется ли оно при использовании старомодного метода:
string credentials = Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes("user"+ ":" + "password"));
request.Headers.Add("Authorization", "Basic " + credentials);
Какой механизм аутентификации защищает веб-службу? Учетные данные, установленные для HttpWebRequest
, будут передаваться только через HTTP-заголовок Authorization
через Basic , Digest или NTLM . Итак, если ваш веб-сервис защищен с помощью WS-Security
, NetworkCredentials
, вероятно, вообще не будут переданы в схему аутентификации, потому что WS-Security
не работает на уровне HTTP.
Вам следует создать прокси-сервер клиента веб-службы для веб-службы с помощью инструмента командной строки wsdl.exe
или чего-то подобного. Это даст вам доступ к схемам аутентификации, поддерживающим веб-службы.
Обновление после комментариев:
Похоже, что HttpWebRequest
должен получить запрос WWW-Authenticate
с 401 Unauthorized
, прежде чем он сможет правильно аутентифицироваться через SSL. Я предполагаю, что в HttpWebRequests
есть два отдельных кодовых пути, обрабатывающих обычный HTTP-трафик и зашифрованный HTTPS-трафик. В любом случае, вы должны попробовать:
HttpWebRequest
на https: //.../
URI. 401 Unauthorized
ответ. Учетными данными
(не уверен, что PreAuthenticate
должно иметь значение true
или false
; проверьте и то, и другое). 200 OK
или то, чем ответит ваша веб-служба. Другой вариант - создать заголовок Авторизация
самостоятельно при начальном запросе:
string credentials = String.Format("{0}:{1}", username, password);
byte[] bytes = Encoding.ASCII.GetBytes(credentials);
string base64 = Convert.ToBase64String(bytes);
string authorization = String.Concat("Basic ", base64);
request.Headers.Add("Authorization", authorization);
Попробуйте установить для request.PreAuthenticate значение true.