Преобразование веб-службы ASMX с использованием HTTP в веб-службу WCF с использованием netTcpBinding означает альтернативу использованию HttpContext - PullRequest
1 голос
/ 04 ноября 2011

Я изучал WCF и медленно проводил рефакторинг своего решения для веб-сервиса ASMX (несколько проектов) в соответствии с найденными мной «лучшими практиками», и я столкнулся с некоторыми проблемами проектирования / архитектуры, в которых я чувствую большую необходимость сделать паузуи обратитесь за советом.

РЕЗЮМЕ: Как использовать HttpContext в службе WCF, которая НЕ использует ASP.Net MVC и "маршруты"?

ДЕТАЛИ: Повышение производительности является основной целью этого переписывания, и я читал, что NetTcpBinding лучше всего подходит для этого, и поэтому я думаю, что мне нужно избегать :

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]

и необходимо избегать :

serviceHostingEnvironment aspNetCompatibilityEnabled="true"

Таким образом, веб-сервис, реорганизованный для WCF, должен избегать ASP.NET-зависимости, такие как HttpContext, Session и т. Д. Я вообще не использую Session, но один веб-метод (UploadFile) в настоящее время использует HttpContext , как в следующих фрагментах:

[WebMethod(Description = "Upload a file with metadata properties packed in a delimited string")]
    public string UploadFile(string trimURL
                , byte[] incomingArray
                , string fileName
                , string RecordTypeName
                , string metaDataString)
    {
    string pathFileInfo; // declared here in a "bare block" so it is in scope for the finally block too
        try
        {
            pathFileInfo = ByteArrayToFile(fileName, incomingArray);
            FileInfo fi = new FileInfo(pathFileInfo);
            if (fi.Exists)
            {

и вотгде используется HttpContext:

        public string ByteArrayToFile(string _FileName, byte[] _ByteArray)
    {
        string fullName = HttpContext.Current.Server.MapPath(@".\UploadWorkArea\") + _FileName;
        using (FileStream _FileStream = new FileStream(fullName
                    , FileMode.Create
                    , FileAccess.Write))
        {
            _FileStream.Write(_ByteArray, 0, _ByteArray.Length);
            _FileStream.Close();
            return fullName;
        }
    }

Поэтому я нашел этот совет здесь: http://msdn.microsoft.com/en-us/library/aa702682.aspx:

" В домене приложения функции, реализованные в среде выполнения HTTP, применяются к содержимому ASP.NET, но не к WCF.Многие специфичные для HTTP функции платформы приложений ASP.NET не применяются к службам WCF, размещенным внутри домена приложений, содержащего содержимое ASP.NET.Примерами этих функций являются следующие:

  • HttpContext : ток всегда равен нулю при доступе из службы WCF. Вместо этого используйте RequestContext.

и чуть ниже:

" Эти ограничения применяются только к службам WCF, размещенным в приложении IIS. Поведение ASPНа содержимое .NET не влияет присутствие WCF. Приложения WCF, для которых требуется функциональность, традиционно предоставляемая конвейером HTTP, должны рассмотреть возможность использования эквивалентов WCF, которые не зависят от хоста и транспорта:

OperationContext вместо HttpContext . "

Наконец, я добавил это пространство имен:

using System.Web.Routing;

.., чтобы решить эту проблему следующим образом:

public RequestContext(
HttpContextBase httpContext,
RouteData routeData

)

И я пришел к точке, где Я чувствую себя очень неуверенно по поводу дальнейших действий .Я немного читал о ASP.NET MVC и его использовании " маршрутизация ", но на самом деле меня там нет - я просто думаю о перестройке, чтобы он мог использоватьболее быстрое связывание для производительности.

Надеюсь, мой вопрос ясен, и я не слишком много рассуждаю, чтобы вы дали мне несколько советов по этому вопросу.

Ответы [ 2 ]

1 голос
/ 04 ноября 2011

см. Второй ответ на Как получить рабочий путь приложения wcf?

string mappedPath = string.Format(@"{0}\UploadWorkArea\", System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath);

Я что-то пропустил или это все, что вам нужно?

1 голос
/ 04 ноября 2011

Я пытался HostingEnvironment.MapPath(), но это вызвало исключение - вы все равно можете попробовать, чтобы увидеть, работает ли он в вашей конфигурации. Я также проверил HttpServerUtility.MapPath() в ILSpy и обнаружил, что он вызывает HttpRequest.MapPath(), но я не знаю, возможно ли получить экземпляр HttpRequest в вашем методе WCF.

Если ничего не помогло, вы можете попробовать использовать свойство HostingEnvironment.ApplicationPhysicalPath. Я попробовал приведенный ниже код, и он возвращал тот же путь, что и Server.MapPath() при вызове в приложении ASP.NET MVC.

Path.GetFullPath(Path.Combine(HostingEnvironment.ApplicationPhysicalPath, @".\UploadWorkArea\", _FileName));

См. этот вопрос относительно использования Path.GetFullPath.

...