none
Удаленный сервер возвратил ошибку Not Found RRS feed

  • Вопрос

  • Пишу приложение на Silverlight 4+WCF. На одной из страниц обращаюся к веб-камере и делаю снимок, который потом через веб-сервис отправляю в базу данных MSSQL. Когда передаю масив байтов в котором содержится снимок (размерность масива всегда передается одинаковая - [1228800]) получаю ошибку из веб-сервиса - Удаленный сервер возвратил ошибку Not Found. Что делать?

    Я пробовал отсылать пустой масив такой же размерности - все равно та же ошибка. Мой веб-конфиг:

    <?xml version="1.0"?>
    <!--
      Дополнительные сведения по настройке приложения ASP.NET см. по ссылке
      http://go.microsoft.com/fwlink/?LinkId=169433
      -->
    <configuration>
    	<connectionStrings>
      <add name="UserBaseConnectionString" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Database1.mdf;Integrated Security=True;User Instance=True"
       providerName="System.Data.SqlClient" />
     </connectionStrings>
    	<system.serviceModel>
    		<bindings>
    			<basicHttpBinding>
    				<binding name="ServicesBinding" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" maxBufferPoolSize="2147483647" openTimeout="0:1:0" receiveTimeout="0:1:0" sendTimeout="0:1:0" closeTimeout="0:1:0">
    					<readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"/>
    				</binding>
    			</basicHttpBinding>
    		</bindings>
    		<services>
    			<service behaviorConfiguration="Shmel.Web.MyServiseBehavior" name="Shmel.Web.MyServise">
    				<endpoint address="" binding="basicHttpBinding" bindingConfiguration="ServicesBinding" contract="Shmel.Web.IMyServise">
    					<identity>
    						<dns value="localhost"/>
    					</identity>
    				</endpoint>
    			</service>
    		</services>
    		<behaviors>
    			<serviceBehaviors>
    				<behavior name="Shmel.Web.MyServiseBehavior">
    					<serviceMetadata httpGetEnabled="true"/>
    					<serviceDebug includeExceptionDetailInFaults="false"/>
    				</behavior>
    				<behavior name="">
    					<serviceMetadata httpGetEnabled="true"/>
    					<serviceDebug includeExceptionDetailInFaults="false"/>
    				</behavior>
    			</serviceBehaviors>
    		</behaviors>
    		<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/>
    	</system.serviceModel>
    	<system.web>
    		<compilation debug="true"/></system.web></configuration>
    
    Помогите.

    23 июня 2012 г. 9:15

Ответы

  • я забрал, но та же ошибка. к тому же другие методы работают прекрасно, так что проблема не в idenity.

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

    Если передавать масив меньше, то все работает.

    ах да, вот еще ClientConfig

    <configuration>
        <system.serviceModel>
            <bindings>
                <basicHttpBinding>
                    <binding name="BasicHttpBinding_IService1" maxBufferSize="2147483647"
                        maxReceivedMessageSize="2147483647" >
                        <security mode="None" />
                    </binding>
                </basicHttpBinding>
            </bindings>
            <client>
                <endpoint address="http://localhost:49160/Service1.svc" binding="basicHttpBinding"
                    bindingConfiguration="BasicHttpBinding_IService1" contract="ServiceReference1.IService1"
                    name="BasicHttpBinding_IService1" />
            </client>
        </system.serviceModel>
    </configuration>
    


    24 июня 2012 г. 9:00
  • "Я думаю что проблема в самом масиве, может он слишком большой чтобы его передавать?" - да, именно так. По умолчанию конфигурация такова, чтобы принимать маленькие порции данных, защитив таким образом от DoS атак. "Но в конфиге все на максимум настроил." - видимо настройки не те. Нужно разбираться дальше в настройках, сам пока я с этим не сталкивался. А как одно из решений: можете отправлять данные порциями, а потом объединять их на сервере.
    25 июня 2012 г. 8:35
    Модератор
  • Сначала, нужно точно определить, что за ошибка. Not Found - значит, что произошла ошибка сервера и за ней может скрываться все, что угодно.

    Для того, чтобы точно определить ошибку, попробуйте использоваться Fiddler2.

    Также можете добавить сл. строки в web.config - этим Вы включите трасировку WCF и сможете узнать, какая на самом деле ошибка произошла по логам сервиса (в папке c:\temp\).

     <system.diagnostics>
        <sources>
          <source name="System.ServiceModel" switchValue="Verbose,ActivityTracing" propagateActivity="true">
            <listeners>
              <add type="System.Diagnostics.XmlWriterTraceListener" name="ServiceModel" initializeData="c:\temp\server.svclog">
                <filter type="" />
              </add>
            </listeners>
          </source>
        </sources>
        <trace autoflush="true" />
      </system.diagnostics>

    27 июня 2012 г. 8:59

Все ответы

  • Где хостится Ваше WCF приложение? Как я понял из конфиг файла в ASP.NET приложении. Какое имено, MVC или WebForms? Используете ли Вы маршрутизацию? Как осуществляется запрос к серверу?
    23 июня 2012 г. 17:13
    Модератор
  • Я ж написал Silverlight приложение(навигации) в связке с WCF сервисом. http://localhost:порт/ShmelTestPage.aspx
    23 июня 2012 г. 18:09
  • Silverlight работает на клиенте. WCF на сервере. Судя по всему, хостом для него является ASP.NET, тогда часть вопроса заданного высше остаётся.
    23 июня 2012 г. 18:26
    Модератор
  • Используется Visual Studio Development Server. Это проект веб-приложения ASP.NET
    23 июня 2012 г. 18:40
  • Повторюсь: Какое имено, MVC или WebForms? Используете ли Вы маршрутизацию? Как осуществляется запрос к серверу?
    23 июня 2012 г. 18:47
    Модератор
  • Вот так создаю приложение

    шаг 1

    шаг 2

    Как может тут быть ASP.NET MVC или WebForms, если это ПРОЕКТ веб-приложения)

    23 июня 2012 г. 18:53
  • Значит используете WebForms. Используется ли маршрутизация? Если хотите чтобы Вам помогли, старайтесь предоставить больше информации об ошибке: подробные сведения о ней, как происходит запрос, какой метод принимает его.
    23 июня 2012 г. 19:30
    Модератор
  • Поскольку я не знаю что это такое, то значит не используется. В WCF сервиса есть метод, который принимает массив байтов в качестве входного параметра, передаю массив и получаю -

    {System.ServiceModel.CommunicationException: Удаленный сервер возвратил ошибку: NotFound. ---> System.Net.WebException: Удаленный сервер возвратил ошибку: NotFound. ---> System.Net.WebException: Удаленный сервер возвратил ошибку: NotFound.
       в System.Net.Browser.BrowserHttpWebRequest.InternalEndGetResponse(IAsyncResult asyncResult)
       в System.Net.Browser.BrowserHttpWebRequest.<>c__DisplayClass5.<EndGetResponse>b__4(Object sendState)
       в System.Net.Browser.AsyncHelper.<>c__DisplayClass4.<BeginOnUI>b__1(Object sendState)
       --- Конец трассировки стека внутреннего исключения ---
       в System.Net.Browser.AsyncHelper.BeginOnUI(SendOrPostCallback beginMethod, Object state)
       в System.Net.Browser.BrowserHttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
       в System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelAsyncRequest.CompleteGetResponse(IAsyncResult result)
       --- Конец трассировки стека внутреннего исключения ---
       в System.ServiceModel.AsyncResult.End[TAsyncResult](IAsyncResult result)
       в System.ServiceModel.Channels.ServiceChannel.EndCall(String action, Object[] outs, IAsyncResult result)
       в System.ServiceModel.ClientBase`1.ChannelBase`1.EndInvoke(String methodName, Object[] args, IAsyncResult result)
       в TestClass.ServiceReference1.Service1Client.Service1ClientChannel.EndAddImage(IAsyncResult result)
       в TestClass.ServiceReference1.Service1Client.TestClass.ServiceReference1.IService1.EndAddImage(IAsyncResult result)
       в TestClass.ServiceReference1.Service1Client.OnEndAddImage(IAsyncResult result)
       в System.ServiceModel.ClientBase`1.OnAsyncCallCompleted(IAsyncResult result)}

    23 июня 2012 г. 19:49
  • С ошибкой всё ясно. Покажите коды методов клиента(Silverlight) и сервиса. Т.е. как реализован запрос и ответ.
    23 июня 2012 г. 20:07
    Модератор
  • в файле IServise1.cs реализовал  

    [OperationContract]
     void AddImage(int id, byte[] image);

    в файле Servise1.svc.cs -

    public DataClasses1DataContext db = new DataClasses1DataContext();

    public void AddImage(int id, byte[] image)
            {
                TableImage im = new TableImage();
                im.id = id;
                im.image = image;
                db.TableImage.InsertOnSubmit(im);
                db.SubmitChanges();
            }

    где TableImage - таблица

    ее перетащил в LinqToSql клас, ну это ж ясно.

    запрос:

     CaptureSource csourse; VideoBrush vid; WriteableBitmap btm;
            private void button1_Click(object sender, RoutedEventArgs e)
            {
                if (CaptureDeviceConfiguration.RequestDeviceAccess())
                {
                    btm = null;
                    csourse = new CaptureSource();
                    csourse.Start();
                    vid = new VideoBrush();
                    vid.SetSource(csourse);
                    rectangle1.Fill = vid;
                    button2.Visibility = System.Windows.Visibility.Visible;
                }
            }

            private void button2_Click(object sender, RoutedEventArgs e)
            {
                csourse.CaptureImageAsync();
                csourse.CaptureImageCompleted += new EventHandler<CaptureImageCompletedEventArgs>(csourse_CaptureImageCompleted);
            }
            void csourse_CaptureImageCompleted(object sender, CaptureImageCompletedEventArgs e)
            {
                btm = e.Result;
                csourse.Stop();
                ImageBrush br = new ImageBrush();
                br.ImageSource = btm;
                rectangle1.Fill = br;
               // byte[] bt = new byte[12288];
                ServiceReference1.Service1Client web = new ServiceReference1.Service1Client();
                web.AddImageAsync(1, btm.ToByteArray());
            }


    • Изменено Letos07 23 июня 2012 г. 20:42
    23 июня 2012 г. 20:40
  • Да, в коде вроде всё нормально. Не внимательно посмотрея я на web.config, уберите оттуда идентификатор DNS

    <identity>
        <dns value="localhost"/>
    </identity>

    тут он вам не нужен, да и указан неверно. Думаю проблема в нём, так как используется дефолтовый порт, а у вашего приложения он другой совсем.

    24 июня 2012 г. 8:11
    Модератор
  • я забрал, но та же ошибка. к тому же другие методы работают прекрасно, так что проблема не в idenity.

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

    Если передавать масив меньше, то все работает.

    ах да, вот еще ClientConfig

    <configuration>
        <system.serviceModel>
            <bindings>
                <basicHttpBinding>
                    <binding name="BasicHttpBinding_IService1" maxBufferSize="2147483647"
                        maxReceivedMessageSize="2147483647" >
                        <security mode="None" />
                    </binding>
                </basicHttpBinding>
            </bindings>
            <client>
                <endpoint address="http://localhost:49160/Service1.svc" binding="basicHttpBinding"
                    bindingConfiguration="BasicHttpBinding_IService1" contract="ServiceReference1.IService1"
                    name="BasicHttpBinding_IService1" />
            </client>
        </system.serviceModel>
    </configuration>
    


    24 июня 2012 г. 9:00
  • "Я думаю что проблема в самом масиве, может он слишком большой чтобы его передавать?" - да, именно так. По умолчанию конфигурация такова, чтобы принимать маленькие порции данных, защитив таким образом от DoS атак. "Но в конфиге все на максимум настроил." - видимо настройки не те. Нужно разбираться дальше в настройках, сам пока я с этим не сталкивался. А как одно из решений: можете отправлять данные порциями, а потом объединять их на сервере.
    25 июня 2012 г. 8:35
    Модератор
  • Попробуйте немного изменить конфиг, дописав туда значения таймаутов и размеров массивов, как предложено в вопросе Large Byte Array over WCF Service that is configured with CustomBinding


    Для связи [mail]

    26 июня 2012 г. 7:09
    Модератор
  • Сначала, нужно точно определить, что за ошибка. Not Found - значит, что произошла ошибка сервера и за ней может скрываться все, что угодно.

    Для того, чтобы точно определить ошибку, попробуйте использоваться Fiddler2.

    Также можете добавить сл. строки в web.config - этим Вы включите трасировку WCF и сможете узнать, какая на самом деле ошибка произошла по логам сервиса (в папке c:\temp\).

     <system.diagnostics>
        <sources>
          <source name="System.ServiceModel" switchValue="Verbose,ActivityTracing" propagateActivity="true">
            <listeners>
              <add type="System.Diagnostics.XmlWriterTraceListener" name="ServiceModel" initializeData="c:\temp\server.svclog">
                <filter type="" />
              </add>
            </listeners>
          </source>
        </sources>
        <trace autoflush="true" />
      </system.diagnostics>

    27 июня 2012 г. 8:59